wie setzen numpy floating-point-Genauigkeit?
Ich habe gerade berechnet, die gleiche Anzahl auf zwei verschiedene Arten, aber in numpy, macht es ein Fehler
[[ 0.910221324013388510820732335560023784637451171875]]
[[-0.9102213240133882887761274105287156999111175537109375]]
diese Zahl ist die gleiche bis zu e^(-15), unterscheidet sich aber danach. Wie behandle ich diesen Fehler?
Gibt es eine Möglichkeit, zu begrenzen, floating-point-Genauigkeit?
Da ich die Berechnung exponentiell mit diesen zahlen, können selbst kleine Unterschiede ergeben sich in frustrierenden Fehler...
- können Sie nach dem code?
- Was ist der "dtype" der Elemente in einem array? Das ist eine wahnsinnige Anzahl von Ziffern ausgegeben.
- float64. da nur Druck Nummer nicht zeigen einen Unterschied von python-print funciton, ich habe np.set_printoptions(precision=70)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tun, Sie kümmern sich um die tatsächliche Genauigkeit des Ergebnisses, oder darum, die genauen Ziffern wieder von Ihren beiden Berechnungen?
Wenn Sie wollen einfach nur die gleichen Ziffern, die Sie nutzen könnten
np.um()
zu Runde die Ergebnisse auf einige geeignete Anzahl von Dezimalstellen. Jedoch, durch diese Weise werden Sie nur reduzieren die Präzision des Ergebnisses.Wenn Sie wirklich wollen, um zu berechnen, wird das Ergebnis genauer, Sie könnten versuchen, mit der
np.longdouble
- Typ für Ihre Eingabe-array, die, je nach Architektur und compiler, ist das vielleicht ein 80 - oder 128-bit-floating-point-Darstellung, eher als die standard-64-bit -np.double
*.Vergleichen Sie die Ungefähre Anzahl der Dezimalstellen Präzision mit
np.finfo
:Beachten Sie, dass nicht alle numpy-Funktionen unterstützen wird long double - einige down-cast es zu verdoppeln.
*Aber einige Compiler (z.B. Microsoft Visual C++) immer behandeln
long double
als Synonym fürdouble
, in dem Fall würde es keinen Unterschied in der Präzision zwischennp.longdouble
undnp.double
.numpy.longdouble
bezieht sich auf unabhängig von der Art der C-compiler ruftlong double
" wie es in deinem link dann leider mit einigen C-Compiler, es wird nicht genauer sein alsdouble
(Visual Studio z.B.). Trotzdem, +1 für die Beantwortung der Frage.np.longdouble
alsnumpy.float128
, aber es liegt - es ist die gleiche alte 80-bit-x87-extended-precision Typ gepolstert mit 6 null-bytes. (Analog, 32-bit-Linux berichten, die vom gleichen Typ wienumpy.float96
.)Im normalen numpy verwenden, die zahlen sind doppelt.
Was bedeutet, dass die Genauigkeit von weniger als 16 Ziffern.
Hier ist ein Thema gelöst, dass enthält die gleichen problematisch ...
Wenn Sie brauchen, um erhöhen Sie die Genauigkeit, die Sie verwenden können,symbolische Berechnung ....
Die Bibliothek mpmath ... ist eine ruhige, gut zu sein.
Der Vorteil ist, dass Sie verwenden können, unbegrenzt Präzision.
Allerdings, die Berechnungen sind langsamer als das, was numpy tun können.
Hier ist ein Beispiel:
Kann man nicht besser machen mit numpy.
Sie können berechnen Exponentialfunktionen mit einer besseren Genauigkeit.
Können Sie
math.ceil
.Beispielsweise Sie haben:
Zurück
8.8697059688
ich.e der Wert bis zu 10 Nachkommastellen. Ändern Sie die1e10
zu1e15
oder jeder andere Wert entsprechendIn Ihrem Fall es wird sein:
Dies wird Ihnen
a = 0.910221324013389