Razón por la peculiar ordenamiento de división y multiplicación en C ++
Pregunta
Estoy en el medio de portar algún código C ++ a Java, y sigo corriendo a través de los casos en el que escribió que siguió haciendo lo siguiente:
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));
En lugar 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));
La segunda parece mucho más claro, y si no estoy equivocado sobre el orden de las operaciones en C ++ que debería hacer lo mismo. ¿Hay alguna razón para hacer el primero y no el segundo? La única cosa que podría pensar en algún caso sería raro con precisión.
Solución
Sí, son la misma. La única razón que se me ocurre es la claridad matemática: a veces cuando se está normalizando una cantidad, a menudo se escribe:
answer = (1/total) * (some of it)
Por ejemplo, teorema de la integral de Cauchy se escribe a menudo
f(a) = (1/(2*pi*i)) * integral(f(z)/(z-a), dz)
Otros consejos
Si a
sigue siendo el mismo y b
está cambiando (por ejemplo, si el código está en un bucle y está claro que a
no cambia entre dos iteraciones, por ejemplo porque es una variable const
), la versión original se puede ejecutar más rápido , porque la multiplicación es más barato que la división (suponiendo que el compilador mueve el cálculo de 1/...
fuera del bucle).
Parece un intento equivocado en la optimización si esa es la razón, pero eso no quiere decir que no lo es.
Ah, y en cuanto a la precisión, la versión original es en realidad un poco menos precisa que la suya, en todo caso, porque hay un error de redondeo adicional para el 1/...
. Este es el error de redondeo que impide que el compilador de la transformación de su versión en la versión original de su propia voluntad:. Que no calculan exactamente lo mismo (pero cosas muy cercanos)
Sí que deben hacer lo mismo. El autor original puede haber sido replicar ecuaciones encontrado otro lugar donde