id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	os	architecture	failure	difficulty	testcase	blockedby	blocking	related
4335	fromRational broken for Ratio a	daniel.is.fischer	simonmar	"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."	bug	closed	normal	7.4.1	libraries/base	6.12.3	fixed			Unknown/Multiple	Unknown/Multiple	Incorrect result at runtime					
