12

需要明确的是,我不是在寻找 NaN 或无穷大,或者问答案x/0应该是什么。我正在寻找的是这个:

根据硬件中除法的执行方式(我不知道它是如何完成的),如果除数为 0 进行除法,而处理器只是愉快地进行操作,结果会是什么?

我意识到这高度依赖于红利,所以对于一个具体的答案,我问这个问题:如果计算机遵循其标准除法运算,它会吐出什么42 / 0

更新:

我会尽量清楚一点。我在询问使用位级别的数字完成的实际操作以达到解决方案。操作的结果只是位。当发现除数为零时,NaN 和错误/异常就会起作用。如果分裂真的发生了,会出现什么位?

4

8 回答 8

12

它可能只是不会停止。整数除法可以通过重复减法在线性时间内进行:对于 7/2,您可以从 7 中减去 2,总共 3 次,这就是商,余数(模数)为 1。如果您要提供像这样的算法除以 0,除非有适当的机制来防止它,否则算法不会停止:您可以从 42 中无限次地减去 0,而不会得到任何结果。

从类型的角度来看,这应该是直观的。未定义计算或非暂停计算的结果⊥(“底部”),即存在于每种类型中的未定义值。整数上没有定义除以零,因此它应该通过引发错误或未能终止来正确地产生⊥。前者可能更可取。;)

其他更有效的(对数时间)除法算法依赖于收敛到商的系列;对于 0 的红利,据我所知,这些要么无法收敛(即无法终止),要么产生 0。请参阅维基百科上的除法

浮点除法同样需要一种特殊情况:将两个浮点数相除,减去它们的指数并将它们的有效数整除。相同的底层算法,相同的问题。这就是为什么在 IEEE-754 中有表示正无穷和负无穷以及有符号零和 NaN(表示 0/0)的原因。

于 2011-11-06T23:59:45.920 回答
8

对于具有内部“除”指令的处理器,例如带有 的 x86 div,如果尝试除以零,CPU 实际上会导致软件中断。该软件中断通常被语言运行时捕获并转换为适当的“除以零”异常。

于 2011-11-06T23:59:10.777 回答
5

硬件除法器通常使用流水线长除法结构。

假设我们现在谈论的是整数除法(而不是浮点数);长除法的第一步是对齐最重要的那些(在尝试从被除数中减去除数之前)。显然,在 0 的情况下这是未定义的,所以谁知道硬件会做什么。如果我们假设它做了一些正常的事情,下一步是执行 log(n) 减法(其中 n 是位位置的数量)。对于产生正结果的每个减法,在输出字中设置一个 1。所以这一步的输出将是一个全1的单词。

浮点除法需要三个步骤:

  • 取指数之差
  • 尾数的定点除法
  • 处理特殊情况

0 由全 0 表示(尾数和指数)。然而,尾数中总是有一个隐含的前导 1,所以如果我们不将这种表示视为一种特殊情况,它看起来和行为就像一个极小的 2 幂。

于 2011-11-07T00:15:58.663 回答
2

这取决于实施。IEE 标准 754 浮点 [1] 定义了有符号无穷大值,因此理论上这应该是除以零的结果。如果除法运算中的恶魔是零,硬件简单地设置一个标志。它没有魔法。

一些错误的(读取 x86)架构如果遇到被零除,这在理论上是一个陷阱,从数学的角度来看,这是一种逃避。

[1] http://en.wikipedia.org/wiki/IEEE_754-2008

于 2011-11-06T23:59:18.387 回答
1

这将是一个无限循环。通常,除法是通过连续减法完成的,就像乘法是通过连续加法完成的一样。

因此,零是特殊情况,因为无论如何我们都知道答案是什么。

于 2011-11-06T23:59:27.147 回答
1

它实际上会吐出一个异常。在数学上,42 / 0 是未定义的,因此计算机不会向这些输入输出特定值。我知道除法可以在硬件中完成,但是设计良好的硬件会有某种标志或中断来告诉你寄存器中包含的任何值应该包含结果都是无效的。许多计算机对此例外。

于 2011-11-07T00:02:27.510 回答
1

在 x86 上,发生中断 0 并且输出寄存器不变

最小的 16 位实模式示例(例如添加到引导加载程序):

    movw $handler, 0x00
    movw %cs, 0x02
    mov $0, %ax
    div %ax
    /* After iret, we come here. */
    hlt
handler:
    /* After div, we come here. *
    iret

如何详细运行这段代码|| 32 位版本

DIV 指令的英特尔文档没有说常规输出寄存器(ax== 结果,dx== 模块)被修改,所以我认为这意味着它们保持不变。

然后,Linux 将处理该中断以向执行该操作的进程发送 SIGFPE,如果不处理,它将杀死它。

于 2015-10-21T20:03:08.257 回答
-1

X / 0 其中 X 是实数元素并且大于或等于 1,因此 X / 0 = 无穷大的答案。

除法(c#)

Int Counter = 0; /* used to keep track of the division */
Int X = 42;      /* number */
Int Y = 0;       /* divisor */
While (x > 0) { 
    X = X - Y; 
    Counter++;
}
Int answer = Counter;
于 2013-12-31T12:27:34.617 回答