В настоящее время я пишу код, в котором у меня есть что-то вроде:
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!");
Короче говоря, я хотел бы знать: как я могу достоверно сравнивать числа с плавающей запятой (меньше, больше, равенство)?
Диапазон чисел, который я использую, примерно от 10Е-14 до 10Е6, поэтому мне нужно работать с небольшими числами, а также большими.
Я отметил это как агностик языка, потому что меня интересует, как я могу это сделать независимо от того, какой язык я использую.