Почему 0 mod 0 является ошибкой?

Если я наберу:

int main() { return 0 % 0; }

Я возвращаю ошибку:

error C2124: divide or mod by zero

В чем причина этого? Разве ответ не ноль?


person user541686    schedule 15.10.2013    source источник
comment
Почему вы думаете, что это будет 0?   -  person 0x499602D2    schedule 15.10.2013
comment
@ 0x499602D2: Потому что 0 % равно нулю...   -  person user541686    schedule 15.10.2013
comment
Все % 0 не определено.   -  person 0x499602D2    schedule 15.10.2013
comment
@ 0x499602D2: Ну, деление не определено, потому что 0 × N = 0 имеет бесконечное количество решений для N. Но разве 0 × N + M = 0 не имеет только одно решение для M, то есть ноль, согласны?   -  person user541686    schedule 15.10.2013
comment
Я согласен, но я не уверен, что понимаю особенности того, почему это конкретное выражение не определено.   -  person 0x499602D2    schedule 15.10.2013
comment
Разве это не вопрос математики, а не программирования?   -  person user2802841    schedule 15.10.2013
comment
@user2802841: user2802841: Я не уверен, это тоже не определено в математике? Я столкнулся с этим только тогда, когда мой код дал сбой, я не помню, чтобы когда-либо видел это в какой-либо книге по математике раньше.   -  person user541686    schedule 15.10.2013
comment
Модуль — это остаток от деления, вот так просто. Если деление невозможно, модуль тоже невозможен. Ваша псевдоальтернатива функции по модулю не применима к тому, что происходит на самом деле.   -  person Havenard    schedule 15.10.2013
comment
@Havenard: Что касается целых чисел без знака, определение x%0 == 0 будет представлять собой исключение из принципа, согласно которому x%y < y. Что касается значений с плавающей запятой, я думаю, что fmod(x,0) следовало бы определить как ноль, учитывая, что математически говоря, для любого x предел как (y->0) fmod(x,y) равен нулю.   -  person supercat    schedule 31.10.2013
comment
Кроме того, хотя 0/0 не определено, поскольку не существует уникального значения x, для которого 0*x==0, существует ровно одно возможное значение y, такое что 0*x+y == 0.   -  person supercat    schedule 31.10.2013
comment
Не уверен, что вы говорите, но модуль, возвращающий 0, означает, что остаток от деления равен 0. Невозможно утверждать, что остаток от деления на 0 равен 0, если деление на 0 с самого начала математически неопределенно. Я понимаю, что для некоторых приложений удобно думать, что результат деления по модулю или даже деления на 0 равен 0, но это неверно.   -  person Havenard    schedule 31.10.2013
comment
Возможный дубликат Как делить на ноль без ошибки   -  person Gnemlock    schedule 20.01.2017
comment
Для справки относительно математики операции: math.stackexchange.com/questions/516251/   -  person Andrew    schedule 05.10.2017
comment
@Andrew: Подожди, шучу, это n % 0, а не 0 % 0...   -  person user541686    schedule 05.10.2017


Ответы (3)


В математике x mod 0 не определено, отсюда и ошибка.

person 0x499602D2    schedule 15.10.2013
comment
Ладно, признаю, я этого не знал. (Я никогда даже не думал об этом раньше.) Думаю, я пойду спрошу на Math.SE... спасибо. - person user541686; 15.10.2013
comment
0x499602D2, вы слишком категоричны. Согласно одному соглашению, x (mod 0) равно x. Обоснование таково: в модульной арифметике z ≡ x (mod y) означает, что существует некоторое целое число k такое, что z - x = k * y. Если y = 0, то мы получаем z - x = 0 или z = x. - person Peter John Acklam; 03.04.2015

Из стандарта С++, раздел 5.5:

Если во время вычисления выражения результат не определен математически или не находится в диапазоне представляемых математических значений для его типа, поведение не определено. [...] Обработка деления на ноль, формирование остатка с использованием делителя нуля и все исключения с плавающей запятой различаются в зависимости от машины и обычно настраиваются библиотечной функцией.

Поскольку остаток от деления на ноль математически не определен независимо от того, на какое число делится, ответ не определен в соответствии со стандартом C++.

person Sergey Kalinichenko    schedule 15.10.2013

Функция mod фактически аналогична функции целочисленного деления, за исключением того, что она дает вам остаток, а не частное. На ноль делить нельзя...

(Кстати, 0/0 — это даже не бесконечность, это неопределенность.)

person jwismar    schedule 15.10.2013