Não consegui encontrar documentação para esse comportamento e parece ser um bug ([Editar] de fato é: gitlab.haskell.org/ghc/ghc/-/issues/10387 ). Estou esquecendo de algo?
Em GHCi:
> import GHC.Real
> inf = 1/O :: Double
> inf
Infinity
> infinity
1 % 0
> fromRational infinity
Infinity
> toRational inf
179769313486231590... % 1
> toRational inf == infinity
False
[Editar:]
Existe uma solução alternativa. Usando o pacote ieee754 , é possível definir o seguinte:
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
Acho que
toRational
não leva em conta os casos de infinito positivo (e negativo). Ele apenas considera o formato binário doDouble
.O infinito positivo é representado em hexadecimal como
0x7FF0000000000000
, que em binário parece como:O expoente é, portanto, o valor máximo, e a mantisse é vazia, o que significa que, se desconsiderarmos o infinito, é equivalente a 2 1024 ≈ 1,79769313486231590 × 10 308 (o expoente é 2047, mas o expoente deve ser subtraído de 1023, ou seja, 1024). Portanto, ele essencialmente realiza uma interpretação binária de e
Double
converte isso para aRational
.