2017-06-07 26 views
4

Ich habe Python3.6, Distribution Anaconda, in zwei verschiedenen Maschinen installiert. Ich kann nicht schwören, dass ich die gleiche Installationsdatei benutzt habe, obwohl ich denke, dass ich es getan habe. Ich sehe das gleiche, wenn ich versuche, den Python, Anaconda und numpy Versionen zu überprüfen: In the server machine In the local machinenumpy.exponential etwas anderes Verhalten

ich kleine numerische Unterschiede zu bekommen. Nach einiger Fehlersuche konnte ich das Problem auf Aufrufe von numpy.exp reduzieren. Gerade Ausführung des Codes

import numpy as np 

x = -0.1559828702879514361612223 
y = np.exp(x) 
print("The exponential of %0.25f is %0.25f" % (x, y)) 

I

The exponential of -0.1559828702879514361612223 is 0.8555738459791129013609634 

in der ersten ('Server') Maschine und

The exponential of -0.1559828702879514361612223 is 0.8555738459791127903386609 

in der zweiten ('lokale') Maschine.

Ich weiß, dass Floats nicht 25 Dezimalstellen haben, aber diese Unterschiede propagieren in meinem Code und finden um die 12. Dezimalstelle statt.

Was könnte der Grund für das unterschiedliche Verhalten sein?

+1

Für was es wert ist, bekomme ich die gleiche Ausgabe wie Ihre "Server", während eine neuere numpy und ältere Python. Vielleicht hat das mit dem Prozessor zu tun? –

+1

Versuchen Sie, Code als Bilder zu vermeiden, da er außerhalb der Reichweite von Suchmaschinen ist. –

+0

@IgnacioVergaraKausel Thx. Vielleicht hast du recht, ich dachte, die Ergebnisse wären prozessorunabhängig, aber vielleicht nicht. Wahrscheinlich aus Unwissenheit, wenn das der Fall ist, finde ich es beunruhigend: ich ersetze meine Maschine, dann ändern sich meine Zahlen ?! – zeycus

Antwort

1

Dies ist nicht wirklich über NumPy, sondern über die Ergebnisse von Gleitkommaoperationen, die systemabhängig sind. Sie würden die gleichen Ergebnisse ohne NumPy erhalten, indem Sie stattdessen math.exp verwenden. Ein einfacheres Beispiel ist

math.exp(2**(-53)) - 1 

die genau 0 auf einem meiner Rechner und 2.22e-16 auf eine andere zurückgibt. Beides ist gleichermaßen falsch, wie die Berechnung von math.expm1(2**(-53)) = 1.11e-16 zeigt (übrigens existiert deshalb die Funktion expm1).

In gewisser Weise ist die CPU-Abhängigkeit gut, deutlich, dass die Ziffern, die zwischen zwei Systemen unterscheiden, wertlos sind. Die Sache, auf die man sich konzentrieren sollte, ist die Anordnung der Berechnungen, um die loss of significance zu reduzieren.

+0

Vielen Dank @alex, Ihr Beispiel ist sehr aufschlussreich. Ich war mir über solche CPU-Abhängigkeiten überhaupt nicht bewusst, aber ich werde von nun an. – zeycus