Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Деление на ноль для переменных типа float

#c #переменные


Если у меня есть
float v = v();
float h = h();

а потом я хочу проверять такое условие:
if (v<0 && ABS(v/h) > 0.5)

то могу ли я быть уверена, что если 
h==0, то ABS(v/h) == INFINITY и INFINITY точно > 0.5?

То есть не нужно ли учитывать, что h может быть равно 0, типа такого: 
if (h==0 ? v<0 : v<0 && ABS(v/h) > 0.5)

?    


Ответы

Ответ 1



Частично да. Числа с плавающей точкой подчиняются стандарту IEEE-754. Если v > 0 и h == 0, то v/h == INFINITY. Гарантировано, что INFINITY > 0.5. Если v < 0 и h == 0, то v/h == -INFINITY. Для него -INFINITY < 0.5. Если v == 0 и h == 0, то v/h == NaN. Для него любое сравнение, ЕМНИП, возвращает false. Операции с бесконечными значениями строго определены в C стандартом IEEE-754. Так что ваш код верен. При работе с плавающей запятой контроль за делением на ноль по умолчанию отключён, и деление на ноль даёт бесконечность или NaN. Существует, однако, метод включить такой контроль. Однако, и в этом случае при делении на ноль не возникнет исключение или какая-то другая ошибка, а лишь будет взведён флаг, который можно опросить вызовом fetestexcept(FE_DIVBYZERO). Возможно, вам пригодится функция atan2: float angle = atan2(h, w); if (angle < -2*PI/3 && angle > -PI/3) ...

Комментариев нет:

Отправить комментарий