2011-01-20 3 views
9

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

Благодаря

+4

Какой тип мы говорим здесь? плавать? – EboMike

ответ

2

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

+5

исключение времени выполнения для целых чисел не требуется. – etarion

24

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

+0

Просто, чтобы быть ясным, если поплавок 0.0 делится на целое число 0, целое число будет отлито как float, а результат - NaN, правильно? –

3

Если вы говорите целые числа, то ваша программа должна потерпеть крах при делении на ноль.

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

8

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

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

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

+1

Стоит отметить, что, по крайней мере, на C, если реализация объявляет поддержку для [C стандартного приложения F] (https://www.python.org/dev/peps/pep-0366/) (необязательно), приложение F переопределяет 6.5 .5 для типов с плавающей точкой и рендеринг с плавающей запятой на ноль. Я не думаю, что в стандарте это явно указано, но есть несколько частей Приложения F, которые определяют, как деление на ноль должно или не должно вести себя. – user2357112

0

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