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

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

Спасибо


person Bob    schedule 20.01.2011    source источник
comment
О каком типе мы здесь говорим? плавать?   -  person EboMike    schedule 20.01.2011


Ответы (4)


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

person etarion    schedule 20.01.2011
comment
Для ясности: если число с плавающей запятой 0,0 разделить на целое число 0, целое число будет преобразовано как число с плавающей запятой, и результатом будет NaN, верно? - person Arthur Dent; 26.02.2018
comment
Да, результат будет NAN - person Alexcei Shmakov; 28.12.2018

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

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

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

person Огњен Шобајић    schedule 13.03.2014
comment
Стоит отметить, что, по крайней мере, в C, если реализация декларирует поддержку C стандартного приложения F (необязательно), Приложение F отменяет 6.5.5 для типов с плавающей запятой и отображает определение деления с плавающей запятой на ноль. Я не думаю, что в стандарте это прямо указано, но в Приложении F есть несколько частей, которые определяют, как деление на ноль должно или не должно вести себя. - person user2357112 supports Monica; 06.10.2016

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

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

person Shinnok    schedule 20.01.2011
comment
Неопределенное поведение ≠ сбой - person idmean; 13.05.2020

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

person goblin01    schedule 17.02.2018