rounded-hw-0.1.0.0: test/ConstantsSpec.hs
{-# LANGUAGE DataKinds #-}
module ConstantsSpec (spec, specT) where
import Data.Proxy
import Numeric.Rounded.Hardware.Internal
import Test.Hspec
import Util
prop_maxFinite :: (RealFloat a, RealFloatConstants a) => Proxy a -> Bool
prop_maxFinite proxy = nextUp maxFinite `sameFloat` (positiveInfinity `asProxyTypeOf` proxy)
prop_minPositive :: (RealFloat a, RealFloatConstants a) => Proxy a -> Bool
prop_minPositive proxy = nextDown minPositive `sameFloat` (0 `asProxyTypeOf` proxy)
prop_almostExact :: RealFloat a => Proxy a -> Rounded 'TowardNegInf a -> Rounded 'TowardInf a -> Bool
prop_almostExact _proxy (Rounded x) (Rounded y) = (x `sameFloat` nextDown y) && (nextUp x `sameFloat` y)
specT :: (RealFloat a, RealFloatConstants a) => Proxy a -> Spec
specT proxy = do
it "maxFinite" $ prop_maxFinite proxy
it "minPositive" $ prop_minPositive proxy
it "pi" $ prop_almostExact proxy pi_down pi_up
it "3*pi" $ prop_almostExact proxy three_pi_down three_pi_up
it "5*pi" $ prop_almostExact proxy five_pi_down five_pi_up
it "log(2)" $ prop_almostExact proxy log2_down log2_up
it "exp(1)" $ prop_almostExact proxy exp1_down exp1_up
it "exp(1/2)" $ prop_almostExact proxy exp1_2_down exp1_2_up
it "exp(-1/2)" $ prop_almostExact proxy expm1_2_down expm1_2_up
it "sqrt(2)" $ prop_almostExact proxy sqrt2_down sqrt2_up
it "sqrt(2)-1" $ prop_almostExact proxy sqrt2m1_down sqrt2m1_up
it "sqrt(1/2)" $ prop_almostExact proxy sqrt1_2_down sqrt1_2_up
it "3-2*sqrt(2)" $ prop_almostExact proxy three_minus_2sqrt2_down three_minus_2sqrt2_up
it "2-sqrt(2)" $ prop_almostExact proxy two_minus_sqrt2_down two_minus_sqrt2_up
spec :: Spec
spec = do
describe "Double" $ specT (Proxy :: Proxy Double)
describe "Float" $ specT (Proxy :: Proxy Float)