Не может мод ноль?


почему X % 0 некорректное выражение?

Я всегда думал X % 0 должно быть равно X. Поскольку вы не можете разделить на ноль, разве ответ, естественно, не должен быть остатком, X (все осталось)?

7   51   2011-09-10 10:58:09

7 ответов:

стандарт C++ (2003) говорит в §5.6/4,

[... Если второй операнд / или % равен нулю, то поведение неопределено; [...]

то есть, следующие выражения вызывают undefined-behavior (UB):

X / 0; //UB
X % 0; //UB

Обратите также внимание, что -5 % 2 Не равно -(5 % 2) (как Петар, кажется, считает в своем комментарии к его ответу). Это определяется реализацией. Спец говорит (§5.6/4),

[...] Если оба операнда неотрицательны, тогда остаток неотрицателен;если нет, то знак остатка определяется реализацией.

этот ответ не для математика. Этот ответ пытается дать мотивацию (ценой математической точности).

математиков:см. здесь.

программисты: запомните это деление на 0 и undefined. Таким образом, mod, который опирается на деление, также undefined.


это представляет собой деление на положительные X и D; он состоит из интеграла часть и дробная часть:

(X / D) =   integer    +  fraction
        = floor(X / D) + (X % D) / D

переставляя, вы получаете:

(X % D) = D * (X / D) - D * floor(X / D)

подставляя 0 на D:

(X % 0) = 0 * (X / 0) - 0 * floor(X / 0)

С делением на 0 и undefined:

(X % 0) = 0 * undefined - 0 * floor(undefined)
        = undefined - undefined
        = undefined

X % D на определение ряд 0 <= R < D, такой, что существует Q, Так что

X = D*Q + R

так что если D = 0, такое число не может существовать (потому что 0 <= R < 0)

Я думаю, потому что, чтобы получить оставшуюся часть X % 0 сначала нужно вычислить X / 0 что дает бесконечность, и попытка вычислить остаток бесконечности на самом деле невозможна.

однако лучшим решением в соответствии с вашим мышлением было бы сделать что-то вроде этого

REMAIN = Y ? X % Y : X

другой способ, который может быть концептуально легко понять проблему:

игнорируя на данный момент вопрос о знаке аргумента, a % b можно легко переписать как a - ((a / b) * b). Выражение a / b неопределено, если b равно нулю, так что в этом случае общее выражение должно быть тоже.

в конце концов, модуль фактически спорные работы, так что если a / b не определено, это неразумно ожидать a % b будет так же.

X % Y дает результат в целочисленном диапазоне [ 0, Y). X % 0 должен был бы дать результат, больший или равный нулю, и меньше нуля.

вы можете избежать "деления на 0" случай(A%B) для его типа float identity mod(a,b) для float (B)=b=0.0 , который не определен или определен по-разному между любыми 2 реализациями, чтобы избежать логических ошибок (жестких сбоев) в пользу арифметических ошибок...

путем вычисления mod([a*b],[b])==b*(a-floor(a))
INSTREAD OF
вычисление mod([a],[b])

где [a*b]= = ваша ось x, с течением времени [b] == максимум кривой качелей (который никогда не будет достигнут) == первая производная от качели функция

https://www.shadertoy.com/view/MslfW8