packages feed

RoundingFiasco-0.1.0.0: test/Main.hs

module Main (main) where

import Rounding
import GHC.Float
import Data.Word

isNaN' :: Eq a => a -> Bool
isNaN' x = x /= x

f64 :: Word64 -> Double
f64 = castWord64ToDouble
f32 :: Word32 -> Float
f32 = castWord32ToFloat

main :: IO ()
main
  = if and tests
      then putStrLn "testsuite SUCCEDED"
      else error "testsuite FAILED"



tests :: [Bool]
tests = []
  <> sign_bit
  <> arithmic_signum
  <> successor
  <> rounding_variant_tests
  <> operator_tests
  <> conversion_tests



sign_bit :: [Bool]
sign_bit =
  [ True
  , 1 == i32_sign_bit_f64 (-1.0/0.0)
  , 1 == i32_sign_bit_f64 (-1.0)
  , 1 == i32_sign_bit_f64 (-0.0)
  , 0 == i32_sign_bit_f64 (0.0)
  , 0 == i32_sign_bit_f64 (1.0)
  , 0 == i32_sign_bit_f64 (1.0/0.0)
  ]


arithmic_signum :: [Bool]
arithmic_signum =
  [ True
  , 1 == i32_sign_bit_f64 (-1.0/0.0)
  , 1 == i32_sign_bit_f64 (-1.0)
  , 1 == i32_sign_bit_f64 (-0.0)
  , 0 == i32_sign_bit_f64 (0.0)
  , 0 == i32_sign_bit_f64 (1.0)
  , 0 == i32_sign_bit_f64 (1.0/0.0)
  ]


successor :: [Bool]
successor =
  [ True
  , f64_successorIEEE (-1/0) == -1.7976931348623157e308
  , f64_successorIEEE (-0.0) == f64 1
  , f64_successorIEEE (0.0) == f64 1
  , f64_successorIEEE (f64 1) == f64 2
  , f64_successorIEEE (f64 2) == f64 3
  , f64_successorIEEE (1.7976931348623157e308) == 1/0
  ]



rounding_variant_tests :: [Bool]
rounding_variant_tests = []
  <> squareRoot_tests
  <> ceil_tests
  <> floor_tests
  <> truncate_tests



squareRoot_tests :: [Bool]
squareRoot_tests = [ True
  , 0.0 == f32_squareRoot_ceil (0.0)
  , 0.0 == f32_squareRoot_floor (0.0)
  , 0.0 == f32_squareRoot_truncate (0.0)
  , 1.0 == f32_squareRoot_ceil (1.0)
  , 1.0 == f32_squareRoot_floor (1.0)
  , 1.0 == f32_squareRoot_truncate (1.0)
  , 3.7433924e-23 == f32_squareRoot_ceil (1.0e-45)
  , 3.743392e-23 == f32_squareRoot_floor (1.0e-45)
  , 3.743392e-23 == f32_squareRoot_truncate (1.0e-45)
  , 1.8446744e19 == f32_squareRoot_ceil (3.4028235e38)
  , 1.8446743e19 == f32_squareRoot_floor (3.4028235e38)
  , 1.8446743e19 == f32_squareRoot_truncate (3.4028235e38)
  ]




ceil_tests :: [Bool]
ceil_tests =
  [ True

  , 0.0 == f64_add_ceil 1 (-1)

  , (1/0) == f32_add_ceil (3.4028235e38) (3.4028235e38)
  , 0 == f32_add_ceil (-3.4028235e38) (3.4028235e38)
  , (-3.4028235e38) == f32_add_ceil (-3.4028235e38) (-3.4028235e38)

  , 5.0e-324 == f64_multiplicate_ceil 5.0e-324 1
  , 10 == f32_divide_ceil 1 0.1

  ]

floor_tests :: [Bool]
floor_tests =
  [ True
  , (-0.0) == f32_subtract_floor 1 1
  , (-0.0) == f32_add_floor 1 (-1)

  , 1 == f32_add_floor 1.0e-45 1
  , isNaN' $ f32_add_floor (1/0) (-1/0)
  , 1.0e-45 == f32_multiplicate_floor 1.0e-45 1

  , 3.743392e-23 == f32_squareRoot_floor (f32 1)
  , 0 == f64_subtract_floor 1 1
  , (1/0) == f32_add_floor 0 (1/0)
  , (-1/0) == f32_divide_floor 1 (-0)

  , 3.4028235e38 == f32_divide_floor 3.4028235e38 1.1754944e-38
  , 3.4028235e38 == f32_add_floor 3.4028235e38 3.4028235e38
  , (-0) == f32_add_floor (-3.4028235e38) 3.4028235e38

  , (-1/0) == f32_add_floor (-3.4028235e38) (-3.4028235e38)

  , 1 == f32_add_floor 1.0e-45 1
  , 1 == f64_add_floor 5.0e-324 1

  , 0 == f32_multiplicate_floor 5.0e-324 1
  , 5.0e-324 == f64_multiplicate_floor 5.0e-324 1
  , 9.999999 == f32_divide_floor 1 0.1

  ]

truncate_tests :: [Bool]
truncate_tests =
  [ True
  , 3.4028235e38 == f32_add_truncate 1.1754944e-38 3.4028235e38
  , 1 == f32_add_truncate 1 1.1754944e-38
  , (-1) == f32_add_truncate (-1) (-1.1754944e-38)

  , 0 == f64_subtract_truncate 1 1

  , 3.4028235e38 == f32_add_truncate (3.4028235e38) (3.4028235e38)
  , 0 == f32_add_truncate (-3.4028235e38) (3.4028235e38)
  , (-3.4028235e38) == f32_add_truncate (-3.4028235e38) (-3.4028235e38)

  , 1.0 == f32_add_truncate 1.0 1.0e-45
  , (-0.99999994) == f32_add_truncate (-1.0) 1.0e-45

  ]




operator_tests :: [Bool]
operator_tests = []
  <> multiplication_tests
  <> division_tests


multiplication_tests :: [Bool]
multiplication_tests =
  [ True

  , 1.0e18 == f32_multiplicate_floor 1.0e9 1.0e9
  , 1.00000005e18 == f32_multiplicate_ceil 1.0e9 1.0e9

  ,  (1/0) == f32_multiplicate_floor (1/0) 3.4028235e38
  ,  (-1/0) == f32_multiplicate_ceil (1/0) (-1/0)

  ,  3.4028235e38 == f32_multiplicate_floor 3.4028235e38 3.4028235e38
  ,  (1/0) == f32_multiplicate_ceil 3.4028235e38 3.4028235e38

  ]


division_tests :: [Bool]
division_tests =
  [ True
  , f32 1051372202 == f32_divide_floor (f32 1065353216) (f32 1077936128)
  , f32 (1051372202 + 1) == f32_divide_ceil (f32 1065353216) (f32 1077936128)

  , f64 4599676419421066581 == f64_divide_floor (f64 4607182418800017408) (f64 4613937818241073152)
  , f64 (4599676419421066581 + 1) == f64_divide_ceil (f64 4607182418800017408) (f64 4613937818241073152)
  ]





conversion_tests :: [Bool]
conversion_tests =
  [ True

  , 9.2233715e18 == f32_convert_i64_signed_floor 9223372036854775807
  , 9.223372e18 == f32_convert_i64_signed_ceil 9223372036854775807
  , 9.007199254740994e15 == f64_convert_i64_unsigned_floor 9007199254740995

  , f64 4845873199050653697 == f64_convert_i64_unsigned_floor 9007199254740995

  , f32 1 == f32_demote_f64_ceil (f64 3931642474694443008)
  , 0 == f32_demote_f64_floor (f64 3931642474694443008)

  , (f32 1) == f32_demote_f64_ceil (f64 1)
  , (f32 0) == f32_demote_f64_ceil (f64 0)
  , (f32 0) == f32_demote_f64_floor (f64 1)
  , (f32 0) == f32_demote_f64_floor (f64 0)

  ]