-- !!! test RealFrac ops (ceiling/floor/etc.) on Floats/Doubles -- main = putStr $ unlines [ -- just for fun, we show the floats to -- exercise the code responsible. 'A' : show (float_list :: [Float]) , 'B' : show (double_list :: [Double]) -- {Float,Double} inputs, {Int,Integer} outputs , 'C' : show ((map ceiling small_float_list) :: [Int]) , 'D' : show ((map ceiling float_list) :: [Integer]) , 'E' : show ((map ceiling small_double_list) :: [Int]) , 'F' : show ((map ceiling double_list) :: [Integer]) , 'G' : show ((map floor small_float_list) :: [Int]) , 'H' : show ((map floor float_list) :: [Integer]) , 'I' : show ((map floor small_double_list) :: [Int]) , 'J' : show ((map floor double_list) :: [Integer]) , 'K' : show ((map truncate small_float_list) :: [Int]) , 'L' : show ((map truncate float_list) :: [Integer]) , 'M' : show ((map truncate small_double_list) :: [Int]) , 'N' : show ((map truncate double_list) :: [Integer]) , 'n' : show ((map round small_float_list) :: [Int]) , 'O' : show ((map round float_list) :: [Integer]) , 'P' : show ((map round small_double_list) :: [Int]) , 'Q' : show ((map round double_list) :: [Integer]) , 'R' : show ((map properFraction small_float_list) :: [(Int,Float)]) , 'S' : show ((map properFraction float_list) :: [(Integer,Float)]) , 'T' : show ((map properFraction small_double_list) :: [(Int,Double)]) , 'U' : show ((map properFraction double_list) :: [(Integer,Double)]) ] where -- these fit into an Int when truncated. Truncation when the -- result does not fit into the target is undefined - not explicitly -- so in Haskell 98, but that's the interpretation we've taken in GHC. -- See bug #1254 small_float_list :: [Float] small_float_list = [ 0.0, -0.0, 1.1, 2.8, 3.5, 4.5, -1.0000000001, -2.9999995, -3.50000000001, -4.49999999999, 1000012.0, 123.456, 100.25, 102.5, 0.0012, -0.00000012, 1.7e4, -1.7e-4, 0.15e-6, pi ] float_list :: [Float] float_list = small_float_list ++ [ 1.18088e+11, 1.2111e+14 ] -- these fit into an Int small_double_list :: [Double] small_double_list = [ 0.0, -0.0, 1.1, 2.8, 3.5, 4.5, -1.0000000001, -2.9999995, -3.50000000001, -4.49999999999, 1000012.0, 123.456, 100.25, 102.5, 0.0012, -0.00000012, 1.7e4, -1.7e-4, 0.15e-6, pi ] double_list :: [Double] double_list = small_double_list ++ [ 1.18088e+11, 1.2111e+14 ]