-- !!! 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
      ]
