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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top