【问题标题】:Why is 0 mod 0 an error?为什么 0 mod 0 是一个错误?
【发布时间】:2013-10-22 16:10:42
【问题描述】:

如果我输入:

int main() { return 0 % 0; }

我得到一个错误:

error C2124: divide or mod by zero

这背后的原因是什么?答案不是零吗?

【问题讨论】:

  • 为什么你认为它会是 0?
  • 任何 % 0 都是未定义的。
  • 这不是更多的数学问题而不是编程问题吗?
  • 模是除法的余数,就这么简单。如果没有除法是可能的,那么模也不是。您对模函数的伪替代方法不适用于实际发生的情况。
  • @Havenard:关于无符号整数,定义x%0 == 0 将构成x%y < y 原则的例外。关于浮点值,我认为fmod(x,0) 应该被定义为零,因为从数学上讲,对于任何 x,fmod(x,y) 的 (y->0) 的限制为零。

标签: c++ visual-c++ math modulo divide-by-zero


【解决方案1】:

在数学中,x mod 0 是未定义的,因此会出现错误。

【讨论】:

  • 好吧,我承认我不知道。 (我以前从没想过。)我想我会去 Math.SE 上问...谢谢。
  • 0x499602D2,你太绝对了。一种约定是 x (mod 0) 是 x。基本原理如下:在模算术中,z ≡ x (mod y) 意味着存在某个整数 k,使得 z - x = k * y。如果 y = 0,那么我们得到 z - x = 0 或 z = x。
【解决方案2】:

mod 函数实际上与整数除法函数相同,只是它给出的是余数,而不是商。你不能除以零...

(顺便说一句,0/0 甚至不是无穷大,它是不确定的。)

【讨论】:

    【解决方案3】:

    来自 C++ 标准,第 5.5 节:

    如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示数学值范围内,则行为未定义。 [...] 除以零的处理,使用零除法器形成余数,所有浮点异常因机器而异,通常可以通过库函数进行调整。

    由于除以零的余数在数学上是未定义的,无论被除数如何,因此根据 C++ 标准,答案是未定义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多