Warum 0,1 + 0,2 == 0,3 in D?
assert(0.1 + 0.2 != 0.3); //shall be true
ist mein Lieblings-prüfen, dass eine Sprache verwendet native Fließkomma-Arithmetik.
C++
#include <cstdio>
int main()
{
printf("%d\n", (0.1 + 0.2 != 0.3));
return 0;
}
Ausgabe:
1
Python
print(0.1 + 0.2 != 0.3)
Ausgabe:
True
Andere Beispiele
Warum ist dies nicht wahr für D? Wie verstehen Sie D verwendet native Fließkomma-zahlen. Ist das ein bug? Verwenden Sie einige bestimmte Anzahl Darstellung? Etwas anderes? Ziemlich verwirrend.
D
import std.stdio;
void main()
{
writeln(0.1 + 0.2 != 0.3);
}
Ausgabe:
false
UPDATE
Dank LukeH. Dies ist ein Effekt, der die Gleitkomma-Konstanten-Faltung beschrieben dort.
Code:
import std.stdio;
void main()
{
writeln(0.1 + 0.2 != 0.3); //constant folding is done in real precision
auto a = 0.1;
auto b = 0.2;
writeln(a + b != 0.3); //standard calculation in double precision
}
Ausgabe:
false
true
InformationsquelleAutor der Frage Stas | 2011-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es wahrscheinlich optimiert wird, um (0.3 != 0.3). Das ist natürlich falsch. Check-Optimierungs-Einstellungen, stellen Sie sicher, Sie sind ausgeschaltet, und versuchen Sie es erneut.
InformationsquelleAutor der Antwort Flynn1179
(Flynn ' s Antwort ist die richtige Antwort. Das eine befasst sich mit der Problematik im Allgemeinen.)
Scheinen Sie zu sein, vorausgesetzt, der OP, dass die floating-point-Ungenauigkeit im code ist deterministisch und vorhersehbar falsch (in einer Art und Weise, Ihr Ansatz ist das genaue Gegenteil, die Leute, die nicht verstehen, floating-point-noch nicht).
Obwohl (wie Ben Punkte out)-floating-point-Ungenauigkeit ist deterministische, aus der Sicht des Codes, wenn du nicht sehr bewusst darüber, was passiert, um Ihre Werte bei jedem Schritt, dies wird nicht der Fall sein. Eine beliebige Anzahl von Faktoren können dazu führen
0.1 + 0.2 == 0.3
Erfolg, compile-Zeit-Optimierung einer zu sein, optimiert die Werte für diejenigen Literale, die eine andere.Verlassen hier weder bei Erfolg noch bei Misserfolg; verlassen Sie sich nicht auf Gleitkommazahlen Gleichheit entweder Weg.
InformationsquelleAutor der Antwort Lightness Races in Orbit
Laut meiner interpretation der D-Sprachspezifikationfloating-point-Arithmetik auf x86 verwenden würde 80 bit Genauigkeit intern, anstatt nur 64 bit.
Müsste man prüfen, aber das ist genug, um zu erklären, das Ergebnis, die Sie beobachten.
InformationsquelleAutor der Antwort Jean Hominal