24

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正确地导致异常。ANaN也可以接受/,但为什么Infinity呢?这样的结果没有数学上的理由。请问您知道这是什么原因吗?

4

4 回答 4

43

div不返回的原因Infinity很简单——类型中没有无穷大的表示Integer

/返回Infinity,因为它遵循 IEEE 754 标准(描述浮点数表示),因为默认Fractional类型是Double. 其他具有浮点数的语言(例如 JavaScript)也表现出这种行为。

为了让数学家更加畏缩,如果你除以0,你会得到不同的结果,尽管-0 == 0对于浮点数:

Prelude> 1/(-0)
-Infinity

这也是标准的行为。

如果您使用不同的小数类型,例如Rational,您将获得您期望的行为:

Prelude> 1 / (0 :: Rational)
*** Exception: Ratio.%: zero denominator

巧合的是,如果您想知道实际操作不引用它们的原因Integer和类型,请查看报告中 Haskell 如何处理默认类型(尤其是数字类型) 。Double

简短的版本是,如果你有一个类中的模棱两可的类型Num,Haskell 将首先尝试Integer然后Double为那个类型。您可以使用语句更改它或使用模块级别default (Type1, Type2...)的语句将其关闭。default ()

于 2012-02-19T22:52:34.040 回答
6

我希望这有帮助:

Prelude> 1/0
Infinity
Prelude> -1/0
-Infinity
Prelude> 0/0
NaN
于 2012-02-19T22:53:05.043 回答
5

由于数学原因,它可能不是那样的。Infinity有时被用作“罪恶箱”:在我们的系统中不能干净地工作的所有东西,把它放在那里。

例子:

Prelude> 10 ** 10 ** 10
Infinity

......绝对不是数学上合理的!

于 2012-02-20T00:47:07.967 回答
3

分数等于浮点(或双精度)类型。

1/n 的分数,其中 n 变为 0,因此 lim(n→0) 1/n = +∞, lim(n→0) -1/n = -∞,这是有道理的。

于 2012-02-19T23:45:26.627 回答