равенство с плавающей запятой/двойное число с точным нулем

У меня есть алгоритм, который использует float или doubles для выполнения некоторых вычислений.

Пример:

double a;
double b;
double c;
...
double result = c / (b - a);
if ((result > 0) && (result < small_number))
{
    // result is relevant...
} else {
    // result not required...
}

Теперь меня беспокоит, что (b - a) может быть равно нулю. Если оно близко к нулю, но не равно нулю, это не имеет значения, потому что результат будет вне допустимого диапазона быть полезным, и я уже обнаружил, что (поскольку (b - a) приближается к нулю, результат будет приближаться к +/- inf, который не находится в диапазоне 0-small_number...)

Но если результат (b - a) точно равен нулю, я ожидаю, что что-то зависящее от платформы произойдет из-за деления на ноль Я мог бы изменить оператор if на:

if ((!((b-a) == 0.0)) && ((result = c/(b-a)) > 0) && (result < small_number)) {

но я не знаю, всегда ли (ba) == 0.0 будет обнаруживать равенство с нулем. Я видел, что есть несколько представления для точного нуля в плавающей запятой?Как вы можете проверить их все, не делая некоторые epsilon c черт возьми, что мне не нужно (маленький эпсилон будет игнорироваться в моем алгоритме)?

Какой способ проверки не зависит от платформы?

EDIT:

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

double result = numerator / denominator;

к исключению с плавающей запятой, исключению процессора, сигналу от операционной системы или чему-то еще....без фактического выполнения операции и наблюдения за тем, будет ли она «бросать» ... потому что обнаружение «броска» такого рода кажется сложным и специфичным для платформы.

Является ли ( (знаменатель==0,0) || (знаменатель==-0,0)) ? «Will 'throw'» : «Не 'throw'»; достаточно?

9
задан Bingo 7 March 2012 в 02:10
поделиться