{-# OPTIONS_GHC -Wall -fno-warn-orphans #-} {-# OPTIONS_HADDOCK hide #-} module ConstMath.Rules ( rationalToFloat , rationalToDouble ) where import GHC.Float import GHC.Real rationalToFloat :: Rational -> Float rationalToFloat (n:%0) | n == 0 = 0/0 | n < 0 = (-1)/0 | otherwise = 1/0 rationalToFloat (n:%d) | n == 0 = encodeFloat 0 0 | n < 0 = -(fromRat'' minEx mantDigs (-n) d) | otherwise = fromRat'' minEx mantDigs n d where minEx = fst (floatRange (0::Float)) mantDigs = floatDigits (0 :: Float) {-# NOINLINE [1] rationalToFloat #-} rationalToDouble :: Rational -> Double rationalToDouble (n:%0) | n == 0 = 0/0 | n < 0 = (-1)/0 | otherwise = 1/0 rationalToDouble (n:%d) | n == 0 = encodeFloat 0 0 | n < 0 = -(fromRat'' minEx mantDigs (-n) d) | otherwise = fromRat'' minEx mantDigs n d where minEx = fst (floatRange (0 :: Double)) mantDigs = floatDigits (0 :: Double) {-# NOINLINE [1] rationalToDouble #-} {-# RULES "ConstMath/rationalToFloat" fromRational = rationalToFloat "ConstMath/rationalToDouble" fromRational = rationalToDouble #-}