assert(0.1 + 0.2 != 0.3); // shall be true
це моя улюблена перевірка того, що мова використовує власну арифметику з плаваючою комою.
C ++
#include <cstdio>
int main()
{
printf("%d\n", (0.1 + 0.2 != 0.3));
return 0;
}
Вихід:
1
Python
print(0.1 + 0.2 != 0.3)
Вихід:
True
Інші приклади
- Java: http://ideone.com/EPO6X
- C #: http://ideone.com/s14tV
Чому це не так для D? Як зрозуміло, D використовує власні числа з плаваючою комою. Це помилка? Чи використовують вони певне представлення числа? Щось ще? Досить заплутано.
D
import std.stdio;
void main()
{
writeln(0.1 + 0.2 != 0.3);
}
Вихід:
false
ОНОВЛЕННЯ
Завдяки LukeH . Це ефект описаного там постійного згортання з плаваючою точкою .
Код:
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
}
Вихід:
false
true