Страницы

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

понедельник, 15 октября 2018 г.

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

Если у меня есть 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) ?


Ответ

Частично да. Числа с плавающей точкой подчиняются стандарту 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) ...

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

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