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.

Foi útil?

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

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top