Как мне делать с плавающей запятой сравнение?

В настоящее время я пишу код, в котором есть что-то вроде:

double a = SomeCalculation1();
double b = SomeCalculation2();

if (a < b)
    DoSomething2();
else if (a > b)
    DoSomething3();

А потом в других местах мне может потребоваться равенство:

double a = SomeCalculation3();
double b = SomeCalculation4();

if (a == 0.0)
   DoSomethingUseful(1 / a);
if (b == 0.0)
   return 0; // or something else here

Короче говоря, У меня много вычислений с плавающей запятой, и мне нужно проводить различные сравнения условий. Я не могу преобразовать его в целочисленную математику, потому что это бессмысленно в данном контексте.

Я читал раньше, что сравнения с плавающей запятой могут быть ненадежными, поскольку могут происходить такие вещи, как это:

double a = 1.0 / 3.0;
double b = a + a + a;
if ((3 * a) != b)
    Console.WriteLine("Oh no!");

Короче , Я хотел бы знать: как я могу надежно сравнивать числа с плавающей запятой (меньше, больше, равенство)?

Я использую диапазон чисел примерно от 10E-14 до 10E6, поэтому мне нужно работать как с маленькими, так и с большими числами.

Я пометил это как языково-независимый, потому что я ' Мне интересно, как я могу это сделать, независимо от того, какой язык я использую.

73
задан phuclv 3 April 2016 в 09:43
поделиться