с ++ деление на 0 - PullRequest
       22

с ++ деление на 0

14 голосов
/ 20 января 2011

Я бегу долгие симуляции. Я записываю результаты в вектор, чтобы вычислить статистику о данных. Я понял, что теоретически эти образцы могут быть результатом деления на ноль; это только теоретически, я уверен, что это не так. Чтобы избежать повторного запуска симуляции после изменения кода, мне было интересно, что произойдет в этом случае. Смогу ли я понять, произошло ли деление на 0 или нет? Буду ли я получать сообщения об ошибках? (Исключения не обрабатываются в данный момент).

Спасибо

Ответы [ 5 ]

30 голосов
/ 20 января 2011

Для операций с плавающей запятой IEEE деление конечного ненулевого числа с плавающей точкой на 0 является четко определенным и приводит к + бесконечности (если значение было> ноль) или -infinity (если значение было меньше нуля).Результатом 0,0 / 0,0 является NaN.Если вы используете целые числа, поведение не определено.

9 голосов
/ 14 марта 2014

Обратите внимание, что стандарт C говорит (6.5.5):

Результатом оператора / является частное от деления первый операнд вторым; Результатом оператора% является остаток. В обеих операциях, если значение второго операнда ноль, поведение не определено.

Таким образом, что-то / 0 не определено (по стандарту) как для целочисленных типов, так и для плавающих точек. Тем не менее, большинство реализаций имеют вышеупомянутое поведение (+ -INF или NAN).

3 голосов
/ 20 января 2011

Если вы говорите целые числа, то ваша программа должна аварийно завершить работу при делении на ноль.

Если вы говорите с плавающей точкой, то деление на ноль допускается, и результатом этого является INF или -INF.Теперь все зависит от вашего кода, если программа потерпит крах, обработает это или продолжит работу с неопределенными / неожиданными результатами.

2 голосов
/ 20 января 2011

Зависит от того, используете ли вы целые числа или числа с плавающей запятой.Для целого числа вы получите исключение времени выполнения.Для чисел с плавающей запятой результат будет +/- бесконечность или NaN для (0,0 / 0,0), который можно проверить с помощью std::isnan().

1 голос
/ 17 февраля 2018

Если вы используете IEEE с плавающей точкой, то он вернет 0 или NaN. Если op1 равен 0, вы получите неопределенное значение. Если op1 выше 0, вы получите бесконечность. Если op1 ниже 0, вы получите -Infinity. Если вы используете деление на 0 напрямую или в целых числах, вы получите ошибку «Исключение с плавающей запятой».

...