Comment dois-je faire floating point de comparaison?

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();

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 ((3 * 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.

  • Il n'y a aucun moyen de le faire de manière fiable lors de l'utilisation de nombres à virgule flottante. Il y aura toujours des nombres que pour l'ordinateur sont égaux si, en réalité, ne le sont pas (dire 1E+100, 1E+100+1), et vous aussi généralement des résultats de calcul que pour l'ordinateur, ne sont pas égaux si, en réalité, sont (voir un des commentaires à nelhage de réponse). Vous aurez à choisir entre les deux, vous avez le désir de moins en moins.
  • D'autre part, si vous, dire, faire affaire uniquement avec des nombres rationnels, vous pourriez mettre en œuvre certains nombre rationnel de l'arithmétique de base sur les nombres entiers, puis deux nombres sont considérées comme égales si l'un des deux numéros peuvent être annulés en bas à l'autre.
  • Et bien, actuellement je suis en train de travailler d'une simulation. L'endroit j'ai l'habitude de faire ces comparaisons est liée à la variable de pas de temps (pour la résolution de certains ode). Il y a quelques cas où j'ai besoin de vérifier si le pas de temps pour un objet est égal, inférieur ou supérieur à un autre objet du pas de temps.
  • le Plus efficace pour les float et double comparaison
  • Pourquoi ne pas utiliser des tableaux? stackoverflow.com/questions/28318610/...
InformationsquelleAutor Mike Bailey | 2011-02-06