Я прочитал это в популярной книге о компьютерной графике,Пропуска «тест на ноль» чеки в IEEE 754
Есть много численных расчетов, которые становятся гораздо проще, если программист используют преимущества IEEE правил. Например, рассмотрим выражение:
а = 1/(1/B + 1/с)
Такие выражения возникают с резисторами и линзами. Если деление на ноль привело к сбою программы (как это было во многих системах перед плавающей точкой IEEE), тогда для проверки малых или нулевых значений b или c потребуется два оператора if. Вместо этого, с плавающей точкой IEEE, если b или c равно нулю, мы получим нулевое значение для a по желанию.
А как насчет случая, когда b=+0
и c=-0
? Затем a=1/inf-inf=nan
. Является ли книга неправильной в отношении этой оптимизации, или я что-то не понял? Похоже, нам все равно понадобится хотя бы одна проверка на наличие признаков b & c, а не на отсутствие проверок.
Редактировать Одно из предложений в комментариях состояло в том, чтобы сделать пост-проверку для NaN. Это идиоматический способ «воспользоваться» этим типом номера?
bool is_nan(float x) { return x != x; }
float optic_thing(float b, float c) {
float result = 1.0f/(1.0f/b + 1.0f/c);
if (is_nan(result)) result = 0;
return result;
}
Не хватит ли простого почтового чека для NaN? – bipll
Вероятно, я что-то пропустил, но непонятно, почему это утверждение было бы истинным. Если либо b, либо c равно нулю, то это выражение становится равным 1/бесконечности, что не равно нулю. –
Вам понадобится * три * проверки 0 для вашего выражения, если 'b' или' c' могут быть отрицательными. Потому что '1/b + 1/c' будет' 0', если 'b == -c' –