Warum Visual Studio 2008 sagen Sie mir ,9-0,8999999999999995 = 0.00000000000000055511151231257827?

StackOverflow https://stackoverflow.com/questions/1662600

Frage

Wenn ich tippe diese in das Visual Studio 2008 sofort Fenster:

? .9 - .8999999999999995

Es gibt mir dies als Antwort:

0.00000000000000055511151231257827

Die Dokumentation sagt, dass eine doppelte 15-16 Genauigkeitsstellen hat, aber es ist mir ein Ergebnis mit 32-stelliger Genauigkeit zu geben. Wo ist alles, was zusätzliche Präzision kommt aus?

War es hilfreich?

Lösung

Es sind nur 15-16 Ziffern in der Antwort. All diese führenden Nullen zählen nicht. Die Zahl ist eigentlich mehr wie 5,5511151231257827 × 10 -16 . Der Mantissenteil hat 15-16 Ziffern darin. Der Exponent (-16) dient den Dezimalpunkt über um 16 Plätze zu verschieben, aber nicht die Anzahl der Stellen in der Gesamtzahl ändern.

Bearbeiten

Nachdem ich einige Kommentare bekommen, ich bin gespannt, jetzt zu wissen, was wirklich los ist. Ich steckte die Zahl in Frage in diesem IEEE-754-Converter . Es nahm sich die Freiheit der letzten „27“ in „30“ Runden, aber ich glaube nicht, dass die Ergebnisse verändert.

Der Konverter setzt sich die Zahl in seine drei binäre Teile:

Zeichen: 0 (positiv)
Exponent: -51
Mantisse: 1.0100000000000000000000000000000000000000000000000000 (binary 1,25 10 )

So ist diese Zahl 1,01 2 x 2 -51 , oder 1,25 10 x 2 -51 . Da es nur drei signifikante Binärzahlen sind gespeichert werden, dass würde vorschlagen, dass Lars auf etwas sein kann. Sie können nicht „Rauschen“, da sie die gleiche jedes Mal die Zahl umgewandelt wird.

Die Daten legen nahe, dass die einzige gespeicherte Ziffer „5“ ist. Die führenden Nullen kamen aus dem Exponenten und den Rest der scheinbar zufälligen Ziffern sind aus der Berechnung 2 -51 .

Andere Tipps

Sie sollten lesen: Was jeder Informatiker Should Know About Gleitpunktarithmetik .

Im Grunde kommt es auf Gleitkommazahlen mit endlicher Genauigkeit gespeichert werden. Sie haben Ihren Vergleich mit einigem Delta zu tun.

if(.9 - .8999999999999995 <= 0.0001)
  //close enough to be equal

Die führenden Nullen sind nicht signifikant / Teil der Präzision (soweit das Gleitkommazahl betroffen ist - mathematisch gesprochen, sie sind signifikant). Die führenden Nullen sind aufgrund des Exponententeils der Gleitkommadaten Nummer der internen Darstellung.

Der Abschnitt 55511151231257827 (das ist die Mantisse oder Mantisse ) hat 17 Dezimalziffern, die auf 15-16 Digits nahe genug ist.

@ Lars D: Was Sie als richtig erachten, ist nur dann korrekt im Kontext in Frage. .9 - .8999999999999995 arbeitet mit an einem Schwimmer aus Signifikanden 0,625 und Exponenten von -50. Unter 0.625 * 2 -50 Ergebnisse in 5.5511151231257827e-16. Nun, aus dem Kontext der ursprünglichen Frage, haben wir eine Reihe mit 17 signifikanten Stellen, die nicht passieren unsere beste binäre Annäherung der ,0000000000000005 sein. Allerdings sind diese führenden Nullen noch nicht signifikant, soweit die Darstellung der Fließkommazahl betroffen ist.

  

? 0,9-0,8999999999999995

Diese Subtraktion Prozess, mit 15-16 signifikanten Stellen, gibt

  

,0000000000000005

Die restlichen Ziffern runden nur Fehler. Da jedoch immer der Computer 15-16 signifikante Stellen nach der ersten Nicht-Ziffer Null speichert, werden die Rundungsfehler angezeigt und Sie bekommen eine Menge Hinterzufallszahl durch Rundungsfehler erzeugt. So das Ergebnis hat 16 signifikante Stellen aus der Subtraktion plus 16 Ziffern aus dem Speicher des Ergebnisses, die 32 Ziffern gibt.

Der "schwebende" Teil von "floating point" bedeutet, dass Sie etwas näher an 5,5511151231257827 * 10 bekommen ^ (- 16). Das ist nicht genau, wie es dargestellt wird, weil natürlich alles in binären unter der Haube getan, aber der Punkt ist, die Anzahl der signifikanten Ziffern dargestellt wird, sowie eine Zahl, die darstellt, wie weit die radix (Dezimalpunkt) zu bewegen. Wie immer können Sie wikipedia mehr Details geben:

(Der zweite Link ist insbesondere fokussiert auf Ihrem speziellen Fall.)

Ich denke, die da im Binärsystem, 5 periodisch sind, da es nicht teilbare von 2. und dann, was Mark Rushakoff sagte gilt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top