Jump to content

Aviso para quem gosta de usar a função pow() da libm


fredericopissarra
 Share

Recommended Posts

À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:

  1. 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 é:

    png.latex.png.636fdba3a0e8a9f032db1c78f46f796f.png

    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;
     
  2. 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 by fredericopissarra
  • Curtir 1
Link to comment
Share on other sites

  • 1 year later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...