Como esse é o CS e não o Stackoverflow, vou assumir que você está fazendo uma pergunta sobre análise numérica e (para simplificar) o ponto flutuante IEEE-754 em particular. Nesse caso, a resposta à sua pergunta depende em parte do que você quer dizer com "mais fácil" e em parte nos detalhes do sistema.
Nenhuma CPU moderna que eu conheço possui uma instrução construída, que faz exatamente o que você esperaria para a operação (que daqui em diante chamaremos , seu nome usual em C) ou 2 x ( ). Ambos são implementados usando funções de biblioteca.exexp
2xexp2
Como é o caso de todos os métodos numéricos para operações transcendentais, há alguns casos especiais a serem considerados:
exp(NaN) = NaN
exp(+Inf) = +Inf
exp(-Inf) = 0
No entanto, há outra coisa que torna o problema um pouco menos complicado: o domínio útil é bem pequeno. Para binary32, subfluxa exp(x)
se ou mais e transborda se x > 88,7 ou menos. Invulgarmente para operações transcendentais, também podemos ignorar o caso subnormal, pois é indistinguível de se é subnormal. Todas as opções acima também são verdadeiras , exceto que o domínio é um pouco diferente.x<−104x>88.7exp(x)
1.0
x
exp2
Sua intuição está certa em que a maioria das implementações calcula . No entanto, o custo dessa multiplicação por 1ex=2x/ln2 é trivial comparado ao resto da computação. Um método típico usa uma tabela pré-computada comelementosK:1ln2exp2
K
exp2(x)=2n×T[j]×P(y)
onde é a parte inteira de x , a tabela T contém valores de 2 j / K para todos os j no intervalo [ 0 , K ) e P é uma aproximação polinomial de 2 x (o quártico é suficiente para binário32) no intervalo [ 0 , 1nxT2j/Kj[0,K)P2x. Aparte2né barata, pois está apenas manipulando o expoente. Té uma tabela de pesquisa. Portanto,Pé provavelmente a parte mais cara da operação.[0,1K)2nTP
Devo salientar por completo que as FPUs Intel x86 incluem uma instrução chamada f2xm1
, que calcula por x no intervalo [ - 1 , 1 ] . No entanto, em uma CPU moderna, essa é uma instrução bastante cara e sem pipeline, e você é altamente desencorajado de usá-la. Como observa corretamente a seção 3.8.5 do Intel Optimization Reference Manual :2x−1x[−1,1]
Embora o x87 suporte instruções transcendentais, a implementação da função transcendental na biblioteca de software pode ser mais rápida em muitos casos.
Edit: Foi indicado nos comentários que devo explicar algumas das novas terminologias usadas no IEEE 754-2008. Parte da linguagem mudou desde 1985 e 1987, e a maioria das pessoas está muito mais familiarizada com o velho jargão.
Os termos "binary32" e "binary64" são os novos nomes para números de ponto flutuante binário de 32 e 64 bits, que o antigo padrão chamou de "único" e "duplo", respectivamente.
O termo "número subnormal" substitui o termo anterior "número desnormal" ou "número desnormalizado" .