不能修改零?
Can't Mod Zero?
为什么X % 0
是无效表达式?
我一直认为X % 0
应该等于X。既然你不能除以0,那么答案自然不应该是余数X(所有剩下的东西)吗?
c++标准(2003)在§5.6/4中说,
[…如果/或%的第二个操作数为零,则行为为未定义;[…]
也就是说,下列表达式调用未定义行为(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
根据定义是一个数字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,小于0的结果
您可以避免(A%B)的类型float identity mod(A, B) for float(B)= B =0.0的"除0"情况,这是未定义的,或者在任何两个实现之间定义不同,以避免逻辑错误(硬崩溃)而有利于算术错误…
通过计算mod([a*b],[b])==b*(a-floor(a))
INSTREAD的
计算mod([a],[b])
其中[a*b]== x轴,随时间变化[b] ==跷跷板曲线的最大值(永远不会达到)==跷跷板函数的一阶导数
https://www.shadertoy.com/view/MslfW8我想是因为要得到X % 0的余数,你需要首先计算X/0,它产生无穷大,而试图计算无穷大的余数实际上是不可能的。
然而,与您的想法一致的最佳解决方案是这样做,
ans = Y ? X % Y : X
同样,在c++文档中,X % 0或X/0的结果是一个未定义的值
计算机如何划分:
从被除数开始,减去除数,直到结果小于除数。减去的次数就是结果剩下的就是余数。例如,要将10除以3:
10 - 3 = 7
7 - 3 = 4
4 - 3 = 1
10 / 3 = 3
10 % 3 = 1
除1和0:
1 / 0
1 - 0 = 1
1 - 0 = 1
1 - 0 = 1
...
1 / 0 = Infinity (technically even infinity is too small, but it's easy to classify it as that)
1 % 0 = NaN
如果没有什么可以阻止它,CPU将继续执行这个操作,直到它过载并返回一个完全随机的结果。因此,在CPU级别上有一条指令,如果除数为0,则返回NaN
或Infinity
(取决于您的平台)。
这将永远不会结束,所以剩余部分是未定义的(计算机的NaN
)。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的for循环不能正确获取argv
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么模板类中的对象不能返回值
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 变量只能全局"declared",但不能修改/(单独初始化)
- 为什么我不能修改通过引用传递的向量?
- 既然静态成员函数不能修改非静态成员变量,为什么还要使用它呢?
- 为什么函数"strlen"不能像这样修改"ch1"的长度?
- 如果"this"不是常量,为什么我不能修改它?
- 可移植方式(linux 和 Windows)让文件只能由 1 个进程修改,而不能由 C/C++ 中的其他进程修改
- c++中不能修改左值
- 不能修改零?
- 如果我们不能修改set元素,为什么std::set会提供begin()和end()
- 如果没有在互斥对象下修改共享原子变量,则不能正确发布