gpt4 book ai didi

math - Haskell 中除以零

转载 作者:行者123 更新时间:2023-12-03 04:15:35 26 4
gpt4 key购买 nike

我发现 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

我非常惊讶地发现小数除以零会导致无穷大,而div正确地导致异常。对于 / 来说,NaN 也是可以接受的,但为什么是 Infinity 呢?对于这样的结果没有任何数学依据。请问您知道原因吗?

最佳答案

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

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

为了让数学家们更加畏缩,如果除以 0,你会得到不同的结果,尽管 float 的 -0 == 0 是这样的:

Prelude> 1/(-0)
-Infinity

这也是标准的行为。

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

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

巧合的是,如果您想知道为什么当您的实际操作没有引用 IntegerDouble 时它们是有问题的类型,请看看 Haskell 是如何处理的report 中的默认类型(尤其是数字类型) .

简单来说,如果 Num 类中有一个不明确的类型,Haskell 将首先尝试 Integer,然后尝试 Double类型。您可以使用 default (Type1, Type2...) 语句更改此设置,或在模块级别使用 default () 语句将其关闭。

关于math - Haskell 中除以零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9354016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com