{-# 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
      #-}