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

http://ideone.com/ErBMd

Python

print(0.1 + 0.2 != 0.3)

Ausgabe:

True

http://ideone.com/TuKsd

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

http://ideone.com/mX6zF

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

http://ideone.com/z6ZLk

InformationsquelleAutor der Frage Stas | 2011-07-29

Schreibe einen Kommentar