Jump to content
Sign in to follow this  
fredericopissarra

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

Recommended Posts

Posted (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:

  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

Share this post


Link to post
Share on other sites

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.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...