Warum sagt Visual Studio 2008 mir .9 - .8999999999999995 = 0.00000000000000055511151231257827?

8

Wenn ich dies in das direkte Fenster von Visual Studio 2008 eintippe:

? .9 - .8999999999999995

Es gibt mir dies als Antwort:

0.00000000000000055511151231257827

Die Dokumentation besagt, dass ein Double 15-16 Stellen Genauigkeit hat, aber es gibt mir ein Ergebnis mit 32 Stellen Genauigkeit. Woher kommt die extra Präzision?

    
raven 02.11.2009, 17:30
quelle

6 Antworten

41

There sind nur 15-16 Ziffern in der Antwort. All diese führenden Nullen zählen nicht. Die Zahl ist tatsächlich mehr wie 5.5511151231257827 × 10 -16 . Der Mantissenteil enthält 15-16 Ziffern. Der Exponent (-16) dient dazu, den Dezimalpunkt um 16 Stellen zu verschieben, ändert jedoch nicht die Anzahl der Ziffern in der Gesamtanzahl.

Bearbeiten

Nachdem ich ein paar Kommentare bekommen habe, bin ich jetzt gespannt, was wirklich los ist. Ich habe die fragliche Nummer in diesen IEEE-754-Konverter gesteckt. Es hat sich die Freiheit genommen, die letzten "27" auf "30" zu runden, aber ich denke nicht, dass sich das ändert.

Der Konverter zerlegt die Zahl in ihre drei Binärteile:

Zeichen: 0 (positiv)
Exponent: -51
Bedeutung: 1.0100000000000000000000000000000000000000000000000000 (binär für 1,25 10 )

Also ist diese Anzahl 1,01 2 × 2 -51, oder 1,25 10 × 2 -51. Da nur drei signifikante Binärziffern gespeichert sind, würde dies nahelegen, dass Lars auf etwas stehen könnte. Sie können nicht "Zufallsrauschen" sein, da sie jedes Mal, wenn die Zahl konvertiert wird, gleich sind.

Die Daten legen nahe, dass die einzige gespeicherte Ziffer "5" ist. Die führenden Nullen kommen vom Exponenten und der Rest der scheinbar zufälligen Ziffern stammt aus der Berechnung 2 -51 .

    
Barry Brown 02.11.2009, 17:57
quelle
17

Sie sollten lesen: Was jeder Informatiker sollte Wissen über Gleitkommaarithmetik .

Grundsätzlich kommt es darauf an, dass Fließkommazahlen mit endlicher Genauigkeit gespeichert werden. Sie müssen Ihren Vergleich mit einem Delta machen.

%Vor%     
Lolindrath 02.11.2009 17:39
quelle
14

Die führenden Nullen sind nicht signifikant / Teil der Genauigkeit (soweit es die Gleitkommazahl betrifft - mathematisch sind sie signifikant). Die führenden Nullen sind auf den Exponententeil der internen Darstellung der Gleitkommazahl zurückzuführen.

Der Teil 55511151231257827 (was die significand oder Mantisse ist) hat 17 Dezimalziffern, die nahe genug an 15-16 Stellen sind.

@Lars D: Was Sie für richtig halten, ist nur im Kontext der Frage korrekt. .9 - .8999999999999995 arbeitet mit einem Float mit einem Signifikanzwert von 0,625 und einem Exponenten von -50. Unter Verwendung von 0,625 · 2 -50 ergibt sich 5,5511151231257827e-16. Nun, außerhalb des Kontextes der ursprünglichen Frage, haben wir eine Zahl mit 17 signifikanten Stellen, die zufällig unsere beste binäre Näherung von 0.0000000000000005 ist. Diese führenden Nullen sind jedoch immer noch nicht signifikant, was die Darstellung der Gleitkommazahl betrifft.

    
Mark Rushakoff 02.11.2009 17:31
quelle
4
  

? .9 - .8999999999999995

Dieser Subtraktionsprozess mit 15-16 signifikanten Ziffern ergibt

  

0.0000000000000005

Die restlichen Ziffern sind nur Rundungsfehler. Da der Computer jedoch immer 15-16 signifikante Ziffern hinter der ersten Ziffer ungleich Null speichert, werden die Rundungsfehler angezeigt, und Sie erhalten viele nachgestellte Zufallszahlen, die durch Rundungsfehler erzeugt werden. Also hat das Ergebnis 16 signifikante Ziffern von der Subtraktionsoperation plus 16 Ziffern von der Speicherung des Ergebnisses, was 32 Ziffern ergibt.

    
Lars D 02.11.2009 17:37
quelle
3

Der "fließende" Teil von "Fließkomma" bedeutet, dass Sie etwas näher an 5.5511151231257827 * 10 ^ (- 16) bekommen. Das ist nicht genau so, wie es dargestellt wird, denn natürlich wird alles unter der Haube im Binärformat gemacht, aber der Punkt ist, die Zahl wird durch die signifikanten Ziffern dargestellt, plus eine Zahl, die angibt, wie weit der Radix (Dezimalpunkt) verschoben werden soll. Wie immer kann Wikipedia Ihnen mehr Details geben:

(Der zweite Link ist speziell auf Ihren speziellen Fall ausgerichtet.)

    
jcdyer 02.11.2009 17:41
quelle
0

Ich denke, weil 5 im binären System periodisch ist, weil es nicht durch 2 teilbar ist. Und dann gilt das, was Mark Ruschakoff gesagt hat.

    
eWolf 02.11.2009 17:36
quelle