我找不到此行为的文档,它看起来像是一个错误([编辑] 确实是:gitlab.haskell.org/ghc/ghc /-/issues/10387)。我遗漏了什么吗?
在 GHCi 中:
> import GHC.Real
> inf = 1/O :: Double
> inf
Infinity
> infinity
1 % 0
> fromRational infinity
Infinity
> toRational inf
179769313486231590... % 1
> toRational inf == infinity
False
[编辑 : ]
有一个解决方法。使用包ieee754,可以定义以下内容:
import GHC.Real
import qualified Numeric.IEEE as IEEE
toRational' :: (IEEE.IEEE a, Real a) => a -> Rational
toRational' a
| a == IEEE.infinity = infinity
| a == -IEEE.infinity = -infinity
| otherwise = toRational a
我认为
toRational
它没有考虑正无穷(和负无穷)的情况。它只是考虑了 的二进制格式Double
。正无穷大在十六进制中表示为
0x7FF0000000000000
,在二进制中表示为:因此指数是最大值,尾数为空,这意味着,如果我们不考虑无穷大,则等于2 1024 ≈1.79769313486231590×10 308(指数为 2047,但指数应减去 1023,即 1024)。因此,它本质上是对 进行了二进制解释,
Double
并将其强制转换为Rational
。