【发布时间】:2012-03-10 08:58:09
【问题描述】:
我发现div 和/ 的行为之间存在相当奇怪的不一致。
*ghci> :t 1 `div` 0
1 `div` 0 :: Integral a => a
*ghci> :t 1 / 0
1 / 0 :: Fractional a => a
*ghci> 1 / 0
Infinity
*ghci> 1 `div` 0
*** Exception: divide by zero
我很惊讶地注意到小数除以零会导致Infinity,而div 正确导致异常。
NaN 对于/ 也可以接受,但为什么是Infinity?这样的结果没有数学上的理由。请问您知道这是什么原因吗?
【问题讨论】:
-
在数学上,
1 / 0的结果是Infinity是完全合理的。它不是唯一合理的返回值,而是最有意义的返回值。请注意,如果您评估1 / 0 :: Rational,也会收到divide by zero错误。 -
@DanielFischer:我不会称其为“数学上完全合理的”,因为这种紧致化(具有正无穷和负无穷大)破坏了很多支持 ℝ 的定理,其中一些在许多程序中都假定。
-
在处理浮点数时不应该假设这样的事情。即使是像关联性这样的基本属性也不一定成立。
NaNs 的平等也不是自反的! (例如(0/0) /= (0/0). -
@leftaroundabout 这就是为什么它不是
1/0的唯一合理价值。但是 Alexandrov 紧化也破坏了 ℝ 的许多有用性质——更不用说 Čech 紧化了。 -
@DanielFischer:将其计算为 x->0^+ 的 1/x 的极限是合理的,但不仅仅是经典的简单除法。
标签: math haskell division divide-by-zero