assert(0.1 + 0.2 != 0.3); // shall be true
est mon test préféré pour vérifier qu'un langage utilise une arithmétique à virgule flottante native.
C++
#include <cstdio>
int main()
{
printf("%d\n", (0.1 + 0.2 != 0.3));
return 0;
}
Sortie :
1
Python
print(0.1 + 0.2 != 0.3)
Sortie :
True
Autres exemples
- Java : http://ideone.com/EPO6X
- C# : http://ideone.com/s14tV
Pourquoi cela n'est-il pas vrai pour D ? Comme je l'ai compris, D utilise des nombres à virgule flottante natifs. Est-ce un bug ? Utilise-t-il une représentation spécifique des nombres ? Quelque chose d'autre ? C'est assez déroutant.
D
import std.stdio;
void main()
{
writeln(0.1 + 0.2 != 0.3);
}
Sortie :
false
UPDATE
Merci à LukeH . Il s'agit d'un effet du pliage des constantes en virgule flottante décrit là .
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
}
Sortie :
false
true