2017-09-14 10 views
0

Ich habe mich gefragt, warum Zahlen mit doppelter Genauigkeit und einfacher Genauigkeit manchmal gleich sind und manchmal nicht. Zum Beispiel, wenn ich habe, sind die folgenden sie nicht gleich:Gleitkommazahlen mit doppelter Genauigkeit und einfacher Genauigkeit?

import numpy as np 

x=np.float64(1./3.) 
y=np.float32(1./3.) 

aber die folgenden sind gleich:

x=np.float64(3.) 
y=np.float32(3.) 

Ich verstehe, warum der erste Satz von x und y nicht gleich ist, aber ich bin nicht ganz sicher, warum der zweite Satz gleich ist.

Antwort

1

In dieser Antwort wird davon ausgegangen, dass es sich bei Single um IEEE 754 32-Bit-Binär-Gleitkommazahl und bei Double um den entsprechenden 64-Bit-Typ handelt.

Jeder Wert, der genau in einem einzelnen dargestellt werden kann, kann auch genau als ein Doppel dargestellt werden. Das ist der Fall für 3.0. Der nächste einzelne und der nächste Doppel haben beide genau den Wert 3 und sind gleich.

Wenn eine Zahl nicht genau in einer einzigen Zahl dargestellt werden kann, ist die doppelte Zahl wahrscheinlich eine größere Annäherung und unterscheidet sich von der einzelnen Zahl. Das ist der Fall für 1.0/3.0. Die nächste Single ist 0,33333333432674407958984375. Das nächste Doppel ist 0,333333333333333314829616256247390992939472198486328125.

Sowohl single als auch double sind binäre Fließkommawerte. Eine Zahl kann nicht genau ausgedrückt werden, es sei denn, sie ist gleich einem Bruchteil der Form A/(2**B), wobei A eine ganze Zahl ist, B eine natürliche Zahl ist und "**" den Exponenten darstellt. Zahlen wie 0,1 und 0,2, die Dezimalbrüche beenden, aber keine binären Brüche beenden, verhalten sich wie 1/3,0. Zum Beispiel ist die nächste Single auf 0,1 ,100000001490116119384765625, das nächste Doppel ist 0,1000000000000000055511151231257827021181583404541015625

+0

die erste Ungleichung gilt tatsächlich für Zahlen wie 0,2 zum Beispiel. wenn ich x = np.float64 (0.2) und y = np.float32 (0.2) habe, wenn ich x == y mache, gibt es False aus. Ist 0.2 nicht genau in einer einzigen dargestellt? – MSB

+0

@MSB Ich habe auf Ihren Kommentar in der Antwort geantwortet. –

1

Stellen Sie sich ein Drittel in der Basis 10 mit einer begrenzten Anzahl von Stellen zu vertreten haben.

Mit 2 Ziffern (lassen Sie uns diese mit einfacher Genauigkeit nennen), wird es 0,33
mit 4 Ziffern (double precision) sei es 0,3333
werden also die beiden Annäherungen sind nicht gleich.

Nun ist diese umsetzen zu repräsentieren 1/5 in Basis 2. Sie auch eine unendliche Anzahl von Bits (Binärziffern) müssen - es ist ,001100110011 ....

Mit 24bit Signifikanden (IEEE 754 mit einfacher Genauigkeit) und 53 Bits significand (doppelte Genauigkeit), die zwei Gleitkomma-Approximation wird anders sein.

Das Gleiche gilt für 1/3 ...

Wenn die Zahl genau in einfacher Genauigkeit ohne Annäherung dargestellt werden, dann werden beide Darstellung gleich sein.

Das ist ein Zähler in weniger als 25 Bits (ohne die abschließenden Nullen), und ein Nenner ist eine Potenz von 2. (aber nicht zu hoch ein Exponent sowohl im Zähler als auch im Nenner ...).

zum Beispiel 1/2 3/2 5/2 ... 1/4 3/4 5/4 usw. ... wird die gleiche Darstellung haben.

2^24 + 1 wird nicht die gleiche Darstellung haben.
Aber 2^60 wird.

Es gibt anderen Fall, wenn Darstellung ungenauer sein wird, aber Näherung wird die gleiche sein:
2^54 + 1 hat gleichen Schwimmers und Doppel Näherung.
so wird 1 + 2^-60 zum Beispiel.

Verwandte Themen