
I have been using some of the functions of the classes Real and Fractional and I have observed that with the funcion "toRational" we can obtain the fraction that represents a given number. For instance: *P2> toRational (5.2::Float) 5452595 % 1048576 Why we obtain this numbers instead of "52 % 10" or "26 % 5"?
Because you asked for the number to be converted to a Float first, and 5.2 can't be represented exactly in a single-precision float. If you don't go via Float, you get the exact result: Prelude> 5.2 :: Rational 26 % 5
I have also obtained the following results with the functions "fromRational" and "toRational": *P2> (fromRational ((toRational 4) - ( toRational (5.2::Float) )))::Double -1.1999998092651367 *P2> (fromRational ((toRational 4) - ( toRational (5.2::Double) )))::Double -1.2000000000000002 *P2> (fromRational ((toRational 4) - ( toRational 5.2 ))) -1.2000000000000002 *P2> (fromRational ((toRational 4) - ( toRational (5.2::Float) )))::Float -1.1999998
These are all symptoms of rounding. Cheers, Simon
participants (1)
-
Simon Marlow