不能调零?
为什么X % 0
是一个无效的expression式?
我一直认为X % 0
应该等于X.既然你不能被零除,那么答案不应该是剩下的剩余,X(剩下的一切)?
C ++标准(2003)在§5.6/ 4中说,
[…]如果/或%的第二个操作数为零,则行为是未定义的 ; […]
也就是说,下面的expression式调用undefined-behavior(UB):
X / 0; //UB X % 0; //UB
还要注意-5 % 2
不等于-(5 % 2)
(正如Petar在他的回答中似乎暗示的那样)。 它是实现定义的。 规范说(§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))
用D
代替0
:
(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
,并试图计算无穷的余数是不可能的。
然而,符合你的想法的最佳解决scheme是做这样的事情
REMAIN = Y ? X % Y : X
另一种可能在概念上容易理解的问题:
忽略参数符号的问题, a % b
很容易被重写为a - ((a / b) * b)
。 如果b
是零,则expression式a / b
是不确定的,所以在这种情况下,整体expression式也必须是。
最后,模数实际上是一个分裂的操作,所以如果a / b
是不确定的,期望a % b
也是不合理的。
X%Y给出整数[0,Y)范围内的结果。 X%0将不得不给出一个结果大于或等于零,并且小于零。
你可以规避(A%B)为其types浮点型身份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] ==跷跷板曲线的最大值(永远不会达到)==跷跷板函数的一阶导数