Деление на нуль: Неопределенное Поведение или Реализация, Определенная в C и/или C++?

Относительно деления на нуль говорится в стандартах:

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

C++ 03 5.6.4 - двоичный файл / оператор приводит к частному, и двоичный оператор % приводит к остатку от подразделения первого выражения вторым. Если второй операнд / или % является нулем, поведение не определено.

Если мы должны были взять вышеупомянутые абзацы по номиналу, ответом является явно Неопределенное Поведение для обоих языков. Однако, если мы смотрим далее вниз в стандарте C99, мы видим следующий параграф, который, кажется, противоречащий (1):

C99 7.12p4 - макро-БЕСКОНЕЧНОСТЬ разворачивает до константного выражения плавания типа представление положительной или неподписанной бесконечности при наличии;

Стандарты имеют своего рода золотое правило, где Неопределенное Поведение не может быть заменено (потенциально) противоречащим оператором? Запрещая это, я не думаю, что неблагоразумно прийти к заключению, что, если Ваша реализация определяет макрос БЕСКОНЕЧНОСТИ, деление на нуль определяется, чтобы быть таким. Однако, если Ваша реализация не определяет такой макрос, поведение Не определено.

Мне любопытно, что согласие (если таковые имеются) по этому вопросу для каждого из этих двух языков. Был бы ответ изменяться, если мы говорим о целочисленном делении int i = 1 / 0 по сравнению с делением с плавающей точкой float i = 1.0 / 0.0 ?

Примечание (1) C++ 03 стандарта говорит о <cmath> библиотека, которая включает макрос БЕСКОНЕЧНОСТИ.

24
задан River 18 October 2017 в 03:11
поделиться

5 ответов

Не вижу противоречия. Деление на ноль не определено, точка. Нигде в цитируемом тексте нет упоминания "... если не определена БЕСКОНЕЧНОСТЬ" .

Обратите внимание, что нигде в математике не определено, что 1/0 = бесконечность . Один мог бы интерпретировать это таким образом, но это личная интерпретация в стиле «кратчайшего пути», а не звуковой факт.

25
ответ дан 28 November 2019 в 23:20
поделиться

Почему?

Это не имеет математического смысла, это не значит, что 1 / x определяется как ∞ в математике в целом. Кроме того, вам понадобятся как минимум еще два случая: -1 / x и 0 / x также не могут равняться ∞.

См. деление на ноль в целом и раздел о компьютерной арифметике в частности.

4
ответ дан 28 November 2019 в 23:20
поделиться

Для макроса INFINITY: есть явный кодирование для представления +/- бесконечности в стандарте IEEE754, то есть, если все биты экспоненты установлены и все дробные биты очищены (если установлен дробный бит, он представляет NaN)

С моим компилятором (int ) INFINITY == -2147483648 , поэтому выражение, которое оценивается как int i = 1/0 , определенно даст неверные результаты, если будет возвращено INFINITIY

1
ответ дан 28 November 2019 в 23:20
поделиться

1/0 - это не бесконечность, а только

lim 1/x = ∞ (x -> +0)
11
ответ дан 28 November 2019 в 23:20
поделиться

У меня есть только проект C99. В §7.12/4 говорится:

Макрос

 INFINITY

расширяется до постоянного выражения типа типа float, представляющее положительную или беззнаковую бесконечность, если доступно; иначе в положительную константу типа float , которая переполняется во время перевода.

Обратите внимание, что INFINITY может быть определено в терминах переполнения с плавающей точкой, не обязательно с делением на ноль.

1
ответ дан 28 November 2019 в 23:20
поделиться