Почему X % 0
недопустимое выражение?
Я всегда думал, что X % 0
должен равняться X. Поскольку вы не можете делить на ноль, не должен ли естественным образом оставаться ответ, X (все осталось)?
Почему X % 0
недопустимое выражение?
Я всегда думал, что X % 0
должен равняться X. Поскольку вы не можете делить на ноль, не должен ли естественным образом оставаться ответ, X (все осталось)?
Стандарт С++ (2003) гласит в §5.6/4,
[...] Если второй операнд/или% равен нулю, поведение undefined; [...]
То есть, следующие выражения ссылаются на undefined -behavior (UB):
X / 0; //UB
X % 0; //UB
Отметим также, что -5 % 2
НЕ равно -(5 % 2)
(как Петар, кажется, предлагает в своем комментарии к его ответу). Это определяется реализацией. Спектр говорит (§5.6/4),
[...] Если оба операнда неотрицательны, то остаток неотрицателен; , если нет, знак остатка определяется реализацией.
Я хочу увидеть этот.
Поскольку деление на 0
равно undefined
, mod
, которое полагается на деление, также undefined
.
Это представляет собой деление; он состоит из неотъемлемой части и остатка:
(X / D) = floor(X / D) + (X % D) / D
Перегруппировавшись, вы получите:
(X % D) / D = (X / D) - floor(X / D)
(X % D) = D * ((X / D) - floor(X / D))
Подставляя 0
для D
:
(X % D) = D * ((X / 0) - floor(X / 0))
Так как деление на 0
равно undefined
:
(X % D) = D * (undefined - floor(undefined))
(X % D) = D * (undefined)
(X % D) = 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
равно undefined, если b
равно нулю, поэтому в этом случае общее выражение должно быть слишком.
В конце концов, модуль эффективно является делительной операцией, поэтому, если a / b
- undefined, небезопасно ожидать, что a % b
тоже.
X% Y дает результат в целочисленном диапазоне [0, Y). X% 0 должен был бы дать результат, больший или равный нулю, и меньше нуля.
вы можете уклониться от случая "divivion by 0" (A% B) для своего типа float identity mod (a, b) для float (B) = b = 0.0, то есть undefined или определяется по-разному между любые 2 реализации, чтобы избежать логических ошибок (жестких сбоев) в пользу арифметических ошибок...
путем вычисления mod([a*b],[b])==b*(a-floor(a))
ИНСТРУМЕНТ
вычисление mod([a],[b])
где [a * b] == ваша ось x, со временем [b] == максимальная кривая качания (которая никогда не будет достигнута) == первая производная функции качелей