Je suis en train d'écrire un peu de code où j'ai quelque chose le long des lignes de:
double a = SomeCalculation1();
double b = SomeCalculation2();
if (a < b)
DoSomething2();
else if (a > b)
DoSomething3();
Et puis dans d'autres endroits, j'ai peut-être besoin de faire de l'égalité:
double a = SomeCalculation3();
double b = SomeCalculation4();
if (a == 0.0)
DoSomethingUseful(1 / a);
if (b == 0.0)
return 0; // or something else here
En bref, j'ai beaucoup de calcul en virgule flottante en passe et j'ai besoin de faire des comparaisons pour les conditions. Je ne peux pas le convertir en entier mathématiques parce que une telle chose est dénuée de sens dans ce contexte.
J'ai lu avant que virgule flottante comparaisons peuvent être peu fiables, car vous pouvez avoir des choses comme ça:
double a = 1.0 / 3.0;
double b = a + a + a;
if (a != b)
Console.WriteLine("Oh no!");
En bref, je voudrais savoir: Comment puis-je fiable comparer des nombres à virgule flottante (à moins que, plus que, de l'égalité)?
Le numéro de plage que j'utilise est à peu près de 10E-14 à 10E6, donc je n'ai besoin de travailler avec de petits nombres, ainsi que la grande.
J'ai balisé à ce que la langue agnostique parce que je suis intéressé à savoir comment je peux faire ce quelle que soit la langue que j'utilise.