Warum liefert der Ausdruck exp (i * pi) das falsche Ergebnis in GNU Octave?

793
Siyuan Ren

Ich habe heute angefangen, GNU Octave zu lernen, und habe den ersten Ausdruck im Handbuch ausprobiert

exp(i*pi) 

Das Ergebnis ist

ans = -1.0000e+000 + 1.2246e-016i 

Und anscheinend liefert die GNU Scientific Library auch ähnliche Ergebnisse.

Ist dies also ein Octave-Fehler oder allgemeine Probleme mit numerischer Analysesoftware (symbolische Auswertesoftware wird definitiv eine Antwort auf eine exakte geben)?

8
Scheint, dass die Oktave hauptsächlich für die numerische Analyse gedacht ist. Mathematica würde Ihnen auf jeden Fall eine bessere Antwort geben ...: P nur ein Scherz ... Suchen Sie nach einer symbolischen Analyselösung von GNU gd1 vor 12 Jahren 2
@ Giacomo: Das weiß ich. Ich frage mich nur, ob alle numerischen Analysesoftware eine solche Zahl oder nur GNU Octave auswerten. Siyuan Ren vor 12 Jahren 0
@Karsus Ren Dies ist eigentlich kein Software-Fehler, sondern ein Hardware-Fehler. Dies ist eine inhärente Einschränkung des Versuches, Ausdrücke mit irrationalen Zahlen auf Hardware mit einem begrenzten Speicherplatz für eine einzelne Zahl auszuwerten. Breakthrough vor 12 Jahren 0
http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html James vor 12 Jahren 0

1 Antwort auf die Frage

8
Breakthrough

Dies ist kein Fehler, aber aufgrund der Art und Weise, wie Computer Fließkommaoperationen ausführen. Es gibt eine begrenzte Genauigkeit, mit der jeder Computer arbeiten kann, und daher werden manchmal Anomalien wie diese angezeigt. Es ist zwar möglich, Software zu schreiben, die damit umgehen kann, es würde jedoch viel mehr Rechenzeit in Anspruch nehmen und den Speicherbedarf drastisch erhöhen.

Wenn Sie es betrachten, gibt e ^ (i * pi) -1 + 1.2x10 ^ -16i zurück. Wie Sie sehen, ist die Imaginärkomponente extrem klein (die meisten würden sie für vernachlässigbar halten, da sie um 16 Größenordnungen kleiner ist als der Realteil). Diese Komponente wird durch Rundungs- und Präzisionsfehler eingeführt, sowohl mit der Berechnung selbst als auch mit dem gespeicherten Wert von pi, da er irrational ist (siehe diesen Link für ein anderes Beispiel, das sich mit irrationalen Zahlen befasst).

Wenn dieser Berechnungsfehler nicht akzeptabel ist, sollten Sie nach mathematischen Paketen suchen, die eher eine symbolische als eine numerische Analyse durchführen, oder solche, die hochpräzise Gleitkommazahlen verwenden . Die Vorbehalte dabei sind, dass sie den Speicherbedarf drastisch erhöhen und die symbolische Analyse oft langsamer ist. Bei höheren Präzisionswerten werden die Rundungs- / Präzisionsfehler nur verkleinert, nicht jedoch eliminiert.

Ich brauche nur eine Bestätigung, dass dies das übliche Verhalten von numerischer Analysesoftware ist. Siyuan Ren vor 12 Jahren 1
@Karsus Ren Es ist eigentlich ein Verhalten dieser Art von Software mit * hoher Präzision *. Ich weiß, dass dies kontraintuitiv erscheint, aber niedrigere Genauigkeitszahlen geben diese Anomalien nicht so oft zurück. Weitere Informationen finden Sie in diesem Artikel von Microsoft (http://support.microsoft.com/kb/125056). Denken Sie jedoch daran, dass dieses Problem eine Kombination aus Quellcode und Compiler- / Zielarchitektur ist. Auch dieser [Wikipedia-Artikel] (http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems) enthält einige gute Hintergrundinformationen zum Problem. Breakthrough vor 12 Jahren 0
Das zugrunde liegende Problem ist, dass die Konstante "pi" von Octave nicht die mathematische Konstante "π" ist, sondern eine nahe liegende Fließkommazahlung. Die 'exp'-Funktion fügt dem einen weiteren kleinen Fehler hinzu. Ein System, das mit * symbolischen * Ausdrücken arbeitet, könnte "exp (i * pi)" genau berechnen. Octave ist kein solches System. Keith Thompson vor 11 Jahren 1