【问题标题】:remainder of integer division by 0整数除以 0 的余数
【发布时间】:2011-04-08 15:48:10
【问题描述】:

考虑整数除法

a = bq + r

其中a、b、q、r分别为:被除数、除数、商和余数。特别是当 b = 0 时,没有唯一的 q 满足给定 a 的方程,因此在这种情况下商 q 应该是未定义的。

但是,这种情况下确实存在唯一的r,即r = a。在商和余数总是一起定义的前提下,只要 q 未定义,就会得出 r 未定义,但在编程中,我们经常希望使用余数运算%,而不考虑除法/。我实际上遇到了我想要if b == 0 then a else a % b end的情况。

在任何编程语言中是否存在/是否存在与 % 相同但在除数为 0 时返回除数而不是零除法错误的运算符?

大多数(或所有)编程语言对% 0返回零除法错误有什么原因吗?

【问题讨论】:

  • 你知道,今天早些时候我想知道 Chuck Norris 是否可以取零的对数...
  • 有趣的问题。 Scheme(或guile,无论如何)同时具有remaindermodulo 函数(当args 为负时,它们会有所不同,顺便说一句)。它们都在 0 上溢出。
  • “股息”应该是“股息”。另外,我认为您的意思是除数为0,而不是商。商是除法的结果,只要被除数小于除数(对于无符号数),商就为零。在这种情况下,余数等于被除数。当除数为零时,商是未定义的,不清楚将未定义的数乘以零是否为零,因此余数也应该是未定义的。
  • 现在你需要说没有唯一的 'q' 可以满足这个方程。
  • 好吧,我说不清楚零乘以一个未定义的值。真正的论点是根据除法的定义,r 必须小于 b。

标签: integer division integer-division divide-by-zero


【解决方案1】:

在数学上,余数介于 0 和 b-1 之间,其中 b 是除数。因此,当 b = 0 时,r 是未定义的,因为它必须 >= 0。

【讨论】:

  • 啊,是的,这是关键的缺失语句,0
  • @user677480, @pat 感谢您的回答。我不小心忘记了那个条件。现在很清楚了。
【解决方案2】:

是否有任何编程语言可以返回股息?不确定。我从来没有遇到过。

大多数人不返还股息是否有原因? 是的。模数是 CS 中的常见操作,因为它是 CPU 上整数除法的副产品。大多数(如果不是全部)汇编语言都有取模运算,并且此运算使用与除法运算完全相同的硬件。因此,如果您不能在硬件中除以零,那么您就不能在硬件中进行模数为零。

这是否意味着您不能拥有支持此功能的语言?不是真的,但是您必须将 if 语句添加到通常是单个指令的操作中。这可能会导致相当严重的性能损失,所以很少(如果有的话)这样做。

【讨论】:

  • 感谢您的回答。实现它的问题变得非常清楚。
  • 模数/余数运算最常用于检查某个数 x 是否是某个数 y 的倍数。在这种情况下,感兴趣的不是返回的确切值,而是它是否为零。零是零的倍数(唯一的零倍数),并且应用除法的定义使得 a/0 产生零商,而 a 的余数将使测试“x 是 y 的倍数”的常规方法起作用在包括零在内的所有情况下都很顺利。
  • @supercat,没有人试图平滑除以零。如果您需要以特殊方式处理除以零,请使用 if 语句。 Modulus 以它的方式运行,因为它是高效的。如果您需要它做更多事情,那么有很多编程结构可以帮助您实现目标。
  • @Stargazer712:我知道许多硬件供应商已经决定设置除零陷阱比简单地设置一个标志更好,因此允许任何形式的在整数除以零的情况下,可预测的行为比将其保留为 UB 更昂贵(相对成本可能低于要求即使 y 为常数,x/y 必须向零和 x% 截断y 必须与 x 的符号匹配,但会产生成本)。我的意思很简单,x mod 0 不是一个毫无意义的概念,但如果我在设计......
  • ...一种编程语言,我可能会将 mod-zero 测试限制为“是”运算符的倍数。在测试 x 是否是某个任意 y 的倍数时,如果 x 为负数,则无需调整 x%y 的值即可弥补零检查的成本。
猜你喜欢
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
相关资源
最近更新 更多