Question

Je suis au milieu de portage un peu de code C ++ à Java, et je continue à courir à travers les cas où celui qui l'a écrite a continué à faire ce qui suit:

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));

Au lieu 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 seconde semble beaucoup plus claire, et à moins que je me trompe sur l'ordre des opérations en C ++ ils devraient faire la même chose. Y at-il une raison de faire le premier et non le second? La seule chose que je pouvais penser serait certains cas, bizarre avec précision.

Était-ce utile?

La solution

Oui, ils sont les mêmes. La seule raison pour laquelle je peux penser est la clarté mathématique: parfois, quand vous normalisant une quantité, vous écrivez souvent:

answer = (1/total) * (some of it)

Par exemple, le théorème de Cauchy intégral est souvent écrit

f(a) = (1/(2*pi*i)) * integral(f(z)/(z-a), dz)

Autres conseils

Si a reste le même et b est en train de changer (par exemple, si votre code est dans une boucle et il est clair que a ne change pas entre deux itérations, par exemple parce qu'il est une variable const), la version originale peut exécuter plus rapidement , parce que la multiplication est que la division moins cher (en supposant que le compilateur déplace le calcul de 1/... hors de la boucle).

Il semble comme une tentative peu judicieuse à l'optimisation si c'est la raison, mais cela ne veut pas dire qu'il ne l'est pas.

Oh, et en ce qui concerne la précision, la version originale est un peu moins précis, en fait, que le vôtre, si quoi que ce soit, parce qu'il ya une erreur d'arrondi supplémentaire pour le 1/.... Il est cette erreur d'arrondi qui empêche le compilateur de transformer votre version dans la version originale de son propre gré. Ils ne calculent pas exactement la même chose (mais des choses très proches)

Oui, ils devraient faire la même chose. L'auteur original aurait pu reproduire les équations trouvées ailleurs où

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top