Frage

Ich bin in der Mitte etwas c ++ Code zu Java-Portierung, und ich halte über Instanzen laufen, wo wer schrieb es zu tun gehalten wie folgt vor:

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

Statt:

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

Die zweite scheint viel klarer, und wenn ich nicht über die Reihenfolge der Operationen in C ++ falsch liege sie sollten das gleiche tun. Gibt es einen Grund, die erste und nicht die zweite zu tun? Das einzige, was ich denken konnte, würde einige seltsame Fall präzise sein.

War es hilfreich?

Lösung

Ja, sind sie gleich. Der einzige Grund, warum ich denken kann, ist mathematische Klarheit: manchmal, wenn Sie eine Menge sind Normalisierung, oft schreiben Sie:

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

Zum Beispiel Cauchy Integralsatz wird oft geschrieben

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

Andere Tipps

Wenn a bleibt gleich und b ändert (sagen wir, wenn Ihr Code in einer Schleife ist, und es ist klar, dass a nicht zwischen zwei Iterationen, zum Beispiel nicht ändert, weil es eine const Variable ist), dann kann die ursprüngliche Version schneller ausgeführt , da die Multiplikation billiger als Division ist (der Compiler unter der Annahme, bewegt sich die Berechnung von 1/... aus der Schleife).

Es scheint wie ein fehlgeleiteter Versuch, Optimierung, wenn das der Grund ist, aber es bedeutet nicht, es ist es nicht.

Oh, und in Bezug auf Präzision, ist die ursprüngliche Version in der Tat etwas ungenauer als bei Ihnen, wenn überhaupt, weil es ein zusätzlicher Rundungsfehler für die 1/... ist. Es ist dieser Rundungsfehler, die der Compiler die Umwandlung Ihrer Version in die ursprüngliche Version von selbst verhindert. Sie genau das gleiche (aber sehr nahe Dinge) nicht tun berechnen

Ja, sie sollten das gleiche tun. Der ursprüngliche Autor Gleichungen wurden möglicherweise replizieren gefunden sonst wo

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top