fredericopissarra Posted April 22, 2019 at 09:44 PM Share Posted April 22, 2019 at 09:44 PM (edited) Às vezes encontro programinhas escritos por estudantes usando a função pow() mesmo que seja para efetuar um simples shift (multiplicação ou divisão por potências de 2) ou uma sequência pequena de multiplicações. Existem dois problemas: A função não é implementada como uma sucessão de multiplicações. Isso seria inviável para valores grande de y. Assim, a implementação mais comum é: Ou: double pow( double x, double y ) { return exp(y * log(x)); } Onde exp(), log() e a multiplicação tomam, mais ou menos, o mesmo tempo sejam quais forem os valores de x e y.PS: Eu sei que isso não é tudo... pow() também tem critérios para determinar se x < 0 e y, fracionário, para evitar um sqrt(-1), por exemplo; Já que a função espera encontrar argumentos do tipo double, pode-se perder precisão (a precisão de um double é de 53 bits, não 64!). Como consequência do primeiro, a função pow() gasta, aproximadamente 70000 ciclos de clock (yep! 70 mil ciclos!) para ser completada (considerando também a promoção de int para double). Um shift simples gasta 1 ou 2 ciclos. Uma única multiplicação inteira gasta uns 5.... Você não conseguirá elevar um valor inteiro qualquer a uma potência maior que 63, ou seja, fazendo 63 multiplicações, sem causar um overflow, ou seja, gastando 315 ciclos (0,4% do tempo de uma única chamada a pow()). É prudente, então, evitar o uso de funções da libm com cálculos inteiros... Edited April 22, 2019 at 10:01 PM by fredericopissarra 1 Quote Link to comment Share on other sites More sharing options...
bsantos Posted January 2, 2021 at 02:41 AM Share Posted January 2, 2021 at 02:41 AM (edited) . Edited January 14, 2021 at 02:45 PM by bsantos Apagar esse replay. Pois foi feito deste um post novo. E tal post foi resolvido Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.