Das*_*aru 56 c++ modulo divide-by-zero
为什么X % 0表达无效?
我一直认为X % 0应该等于X.既然你不能除以零,那么答案自然不应该是余数,X(剩下的一切)?
Naw*_*waz 40
C++标准(2003)在§5.6/ 4中说,
[...]如果/或%的第二个操作数为零,则行为未定义 ; [...]
也就是说,以下表达式调用undefined-behavior(UB):
X / 0; //UB
X % 0; //UB
Run Code Online (Sandbox Code Playgroud)
请注意,这-5 % 2不等于-(5 % 2)(正如佩塔尔在他对他的回答的评论中所暗示的那样).它是实现定义的.规范说(§5.6/ 4),
[...]如果两个操作数都是非负的,那么余数是非负的; 如果没有,余数的符号是实现定义的.
Mat*_*haq 11
这个答案不适合数学家.这个答案试图给出动机(以数学精度为代价).
数学家: 见这里.
程序员:请记住,除以0是undefined.因此,mod依赖于分裂的也是undefined.
这表示用于正分裂X和D; 它由不可分割的部分和小数部分组成:
(X / D) = integer + fraction
= floor(X / D) + (X % D) / D
Run Code Online (Sandbox Code Playgroud)
重新排列,你得到:
(X % D) = D * (X / D) - D * floor(X / D)
Run Code Online (Sandbox Code Playgroud)
替换0为D:
(X % 0) = 0 * (X / 0) - 0 * floor(X / 0)
Run Code Online (Sandbox Code Playgroud)
由于分裂0是undefined:
(X % 0) = 0 * undefined - 0 * floor(undefined)
= undefined - undefined
= undefined
Run Code Online (Sandbox Code Playgroud)
X % D根据定义是一个数0 <= R < D,使得存在Q使得
X = D*Q + R
Run Code Online (Sandbox Code Playgroud)
因此,如果D = 0,则不存在这样的数字(因为0 <= R < 0)
| 归档时间: |
|
| 查看次数: |
46913 次 |
| 最近记录: |