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
Python
print(0.1 + 0.2 != 0.3)
Output:
True
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.
import std.stdio;
void main()
{
writeln(0.1 + 0.2 != 0.3);
}
Wyjście:
false
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