У меня есть алгоритм, который использует 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'»;
достаточно?