なぜX % 0
無効な式?
私はいつもX % 0
はXに等しくなければなりません。ゼロで割ることはできないので、答えは自然に剰余X(すべてが残っている)であってはなりませんか?
C++ Standard(2003)は、§5.6/ 4で、
[...] /または%の第2オペランドがゼロの場合、動作はndefined;です。 [...]
つまり、次の式はundefined-behavior(UB)を呼び出します。
_X / 0; //UB
X % 0; //UB
_
_-5 % 2
_が-(5 % 2)
と等しくないことにも注意してください(Petarがコメントへのコメントで示唆しているように)。実装定義です。仕様には(§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)
D
を0
に置き換える:
(X % 0) = 0 * (X / 0) - 0 * floor(X / 0)
0
による除算はundefined
であるため:
(X % 0) = 0 * undefined - 0 * floor(undefined)
= undefined - undefined
= undefined
X % D
はdefinition数字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)
として簡単に書き換えられます。 b
がゼロの場合、式_a / b
_は未定義であるため、その場合、式全体も同じである必要があります。
結局、モジュラスは事実上分裂する操作なので、_a / b
_が未定義の場合、_a % b
_も同様に期待するのは不合理ではありません。
X%Yは、整数[0、Y)の範囲の結果を返します。 X%0は、ゼロ以上、ゼロ未満の結果を提供する必要があります。
「(0%による除算)」の場合、(A%B)のタイプはfloat identity mod(a、b)for float(B)= b = 0.0であるため、未定義であるか、2つの実装間で異なって定義されます。算術エラーを優先して論理エラー(ハードクラッシュ)を回避する...
mod([a*b],[b])==b*(a-floor(a))
を計算することにより
INSTREAD OF
computing mod([a],[b])
ここで、[a * b] == x軸、時間経過[b] ==シーソー曲線の最大値(到達しない)==シーソー関数の1次導関数