Ticket #4335 (closed bug: fixed)
fromRational broken for Ratio a
| Reported by: | daniel.is.fischer | Owned by: | simonmar |
|---|---|---|---|
| Priority: | normal | Milestone: | 7.4.1 |
| Component: | libraries/base | Version: | 6.12.3 |
| Keywords: | Cc: | ||
| Operating System: | Unknown/Multiple | Architecture: | Unknown/Multiple |
| Type of failure: | Incorrect result at runtime | Difficulty: | |
| Test Case: | Blocked By: | ||
| Blocking: | Related Tickets: |
Description
The Fractional instance for Ratio a in GHC.Real defines
fromRational (x:%y) = fromInteger x :% fromInteger y
For fixed-width Integral types, that produces invalid results:
Prelude Data.Ratio> fromRational (1 % 2^32) :: Ratio Int 1 % 0 Prelude Data.Ratio> fromRational (3 % (2^32+9)) :: Ratio Int 3 % 9
Via toRational, these can be ported back to Rational.
Ratio a is generally broken for fixed-width types:
Prelude Data.Ratio> 1 % (minBound :: Int) (-1) % (-2147483648)
but the particular brokenness of fromRational can be alleviated by reducing:
fromRational (x:%y) = fromInteger x % fromInteger y
{-# RULES
"fromRational/id" fromRational = id :: Rational -> Rational
#-}
I think it's better to throw a divide by zero error than to produce invalid results here.
Attachments
Change History
Note: See
TracTickets for help on using
tickets.

