fredericopissarra 275 Posted April 22, 2019 Share Posted April 22, 2019 (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 by fredericopissarra 1 Quote Link to post Share on other sites
Apoiador Bit bsantos 1 Posted January 2 Apoiador Bit Share Posted January 2 (edited) . Edited January 14 by bsantos Apagar esse replay. Pois foi feito deste um post novo. E tal post foi resolvido Quote Link to post Share on other sites
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.