Motivo da ordenação peculiar de divisão e multiplicação em C ++
Pergunta
Eu estou no meio de portar algum código C ++ para Java, e eu continuo correndo através casos em que quem escreveu ele continuou fazendo o seguinte:
double c = (1.0/(a+1.0)*pow(b, a+1.0));
double d = (1./(integral(gamma, dmax)-integral(gamma, dmin)))*(integral(gamma+1, dmax)-integral(gamma+1, dmin));
Em vez de:
double c = pow(b, a+1.0)/(a+1.0);
double d = (integral(gamma+1, dmax)-integral(gamma+1, dmin))/(integral(gamma, dmax)-integral(gamma, dmin));
O segundo parece muito mais clara e menos que eu esteja errado sobre a ordem das operações em C ++ que deveriam fazer a mesma coisa. Existe alguma razão para fazer o primeiro e não o segundo? A única coisa que eu poderia pensar seria algum caso estranho com precisão.
Solução
Sim, eles são o mesmo. A única razão que eu posso pensar é a clareza matemática: às vezes quando você está normalizando uma quantidade, muitas vezes você escrever:
answer = (1/total) * (some of it)
Por exemplo, teorema integral de Cauchy é muitas vezes escrita ??p>
f(a) = (1/(2*pi*i)) * integral(f(z)/(z-a), dz)
Outras dicas
Se a
permanece a mesma e b
está mudando (por exemplo, se o seu código está em um loop e é claro que a
não muda entre duas iterações, por exemplo, porque é uma variável const
), então a versão original pode executar mais rápido , porque a multiplicação é mais barato do que a divisão (assumindo que o compilador move o cálculo do 1/...
fora do circuito).
Parece uma tentativa equivocada de otimização, se essa é a razão, mas isso não significa que não é isso.
Ah, e sobre a precisão, a versão original é de fato um pouco menos preciso do que o seu, se alguma coisa, porque há um erro de arredondamento adicional para o 1/...
. É esse erro de arredondamento que impede o compilador de transformar a sua versão para a versão original de sua própria vontade:. Eles não calcular exatamente a mesma coisa (mas coisas muito próximos)
Sim, eles devem fazer a mesma coisa. O autor original pode ter sido replicar equações encontrou mais onde