Dlaczego 0,1 + 0,2 == 0,3 w D?

assert(0.1 + 0.2 != 0.3); // shall be true

to moja ulubiona metoda sprawdzania, czy język używa natywnej arytmetyki zmiennoprzecinkowej.

C ++

#include 

int main()
{
   printf("%d\n", (0.1 + 0.2 != 0.3));
   return 0;
}

Wynik:

1

http://ideone.com/ErBMd

Python

print(0.1 + 0.2 != 0.3)

Output:

True

http://ideone.com/TuKsd

Inne przykłady

Dlaczego nie jest to prawdą w przypadku D? Jak rozumiem, D używa natywnych liczb zmiennoprzecinkowych. Czy to błąd? Czy używają jakiejś określonej reprezentacji liczb? Coś innego? Dość mylące.

D

import std.stdio;

void main()
{
   writeln(0.1 + 0.2 != 0.3);
}

Wyjście:

false

http://ideone.com/mX6zF


UPDATE

Dzięki LukeH . Jest to efekt stałego fałdowania zmiennoprzecinkowego opisanego w tam .

Kod:

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
}

Wyjście:

false
true

http://ideone.com/z6ZLk

75
задан DaveInCaz 20 August 2018 в 17:53
поделиться