Ruby-float-Präzision
Wie ich es verstehe, Ruby (1.9.2) Schwimmer haben eine Genauigkeit von 15 Dezimalstellen. Daher würde ich erwarten, dass die Rundung float x zu 15 Dezimalstellen würde gleich x. Für diese Berechnung ist dies nicht der Fall.
x = (0.33 * 10)
x == x.round(15) # => false
Übrigens, Rundung auf 16 stellen den Wert true zurück.
Können Sie bitte erklären mir das an?
- Aller Wahrscheinlichkeit nach, Ihre Sprache verwendet IEEE 754 double-precision-floating-point-zahlen intern. Die "15 Dezimalstellen" ist nur eine Annäherung, da floating-point-zahlen sind tatsächlich dargestellt in der Basis 2, nicht 10.
- float-zahlen sind so schweben 🙂
- Eine Frage zu floating-Genauigkeit, die ich nicht schließen wollen-hammer! +1.000000000001!
- Ich Frage mich, warum können Sie
==
Fließkomma-zahlen, es ist eine Falle.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Teil des Problems ist, dass bei 0,33 nicht eine genaue Darstellung der zugrunde liegenden format, weil es nicht ausgedrückt werden kann durch eine Reihe von 1 /2n Bedingungen. Also, wenn es ist, multipliziert mit 10 eine Zahl, die etwas anders als 0.33 wird multipliziert.
Für diese Angelegenheit, 3.3 nicht eine genaue Darstellung entweder.
Teil Einer
Wenn die zahlen nicht exakt Basis-10-Darstellung, dort wird der Rest bei der Umwandlung der am wenigsten signifikante Ziffer, für die es Informationen in der Mantisse. Dieser Rest wird sich ausbreiten auf der rechten Seite, vielleicht auch für immer, aber es ist weitgehend sinnlos. Die scheinbare Zufälligkeit dieser Fehler ist wegen dem gleichen Grund, der erklärt, das scheinbar inkonsistente Rundung Sie und Matchu bemerkt. Das ist in Teil zwei.
Teil Zwei
Und diese information (ganz rechts bits) ist nicht ordentlich ausgerichtet mit der information, vermittelt durch eine einzelne Ziffer ist, also die Nachkommastelle wird in der Regel etwas kleiner als der Wert gewesen wäre, wenn die ursprüngliche Präzision hatte, wurde größer.
Dies ist der Grund, warum eine Umwandlung könnte die Runde 1 an 15-stellig und 0.x 16-stellig: da eine längere Konvertierung hat keinen Wert für die bits rechts vom Ende der Mantisse.
to_s
und, in der Tat, hält andere info über das hinaus, was es zeigt standardmäßig.Gut, obwohl ich nicht sicher bin, auf die details, wie Ruby Griffe schwimmt intern, glaube ich zu wissen, warum dieses bestimmte bit der code ist fehlerhaft auf meine box:
Der erste Schwimmer hält 16 Dezimalstellen für insgesamt 17 Ziffern, die, aus welchem Grund auch immer. So, Rundung auf 15 verwirft diese stellen.