不能调零?

为什么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)) 

由于除以0undefined

 (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] ==跷跷板曲线的最大值(永远不会达到)==跷跷板函数的一阶导数

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