assert(0.1 + 0.2 != 0.3); // shall be true
ist meine Lieblingsprüfung, dass eine Sprache native Gleitkomma-Arithmetik verwendet.
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
- Java: http://ideone.com/EPO6X
- C #: http://ideone.com/s14tV
Warum gilt das nicht für D? Nach dem Verständnis verwendet D native Gleitkommazahlen. Ist das ein Fehler? Verwenden sie eine bestimmte Zahlendarstellung? Etwas anderes? Ziemlich verwirrend.
D.
import std.stdio;
void main()
{
writeln(0.1 + 0.2 != 0.3);
}
Ausgabe:
false
AKTUALISIEREN
Danke an LukeH . Dies ist ein Effekt von Gleitkommakonstante Folding 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
==
statt geschrieben haben!=
.real
Typ anstelle desdouble
Typs verwenden: ideone.com/NAXkMAntworten:
Es wird wahrscheinlich auf (0,3! = 0,3) optimiert. Welches ist offensichtlich falsch. Überprüfen Sie die Optimierungseinstellungen, stellen Sie sicher, dass sie ausgeschaltet sind, und versuchen Sie es erneut.
quelle
(Flynns Antwort ist die richtige Antwort. Diese Antwort befasst sich allgemeiner mit dem Problem.)
Sie scheinen davon auszugehen, OP, dass die Gleitkomma-Ungenauigkeit in Ihrem Code deterministisch und vorhersehbar falsch ist (in gewisser Weise ist Ihr Ansatz das genaue Gegenteil von dem von Menschen, die Gleitkomma noch nicht verstehen).
Obwohl (wie Ben weist darauf hin) Gleitkommazahlen Ungenauigkeit ist deterministisch , aus der Sicht des Codes, wenn Sie nicht sehr werden über überlegen , was bei jedem Schritt auf Ihre Werte geschieht, wird dies nicht der Fall sein. Eine beliebige Anzahl von Faktoren kann zu einem
0.1 + 0.2 == 0.3
Erfolg führen, wobei die Optimierung zur Kompilierungszeit einer ist und die optimierten Werte für diese Literale ein anderer sind.Verlassen Sie sich hier weder auf Erfolg noch auf Misserfolg; Verlassen Sie sich in keiner Weise auf die Gleitkomma-Gleichheit .
quelle
/fp:precise
.+
. Das Problem hierbei ist die Programmiersprache, nicht das Gleitkomma. Auch die Gleitkomma-Gleichheit ist perfekt definiert. Sie sollten es nicht verwenden, wenn es nicht das ist, was Sie wollen, das ist alles.d
, nichtIEEE 754
. Ich hoffe wirklich, dass Ihnen das hilft, die Frage zu verstehen.Nach meiner Interpretation der D-Sprachspezifikation würde die Gleitkomma-Arithmetik auf x86 intern 80 Bit Genauigkeit anstelle von nur 64 Bit verwenden.
Man müsste jedoch überprüfen, ob dies ausreicht, um das beobachtete Ergebnis zu erklären.
quelle