content: import Control.Monad
  import Data.Word
  import GHC.Float (word2Double, word2Float)
  import Numeric (showHFloat)
  
  t15926 :: IO ()
  t15926 = do
    let sources = [ 2^63             -- exact
                  , 2^63 - 1         -- round up
                  , 2^63 - 2^9       -- round up
                  , 2^63 - 2^9 - 1   -- round down
                  , 2^63 - 2^10      -- exact
                  , 2^64             -- exact
                  , 2^64 - 1         -- round up
                  , 2^64 - 2^10      -- round up
                  , 2^64 - 2^10 - 1  -- round down
                  , 2^64 - 2^11      -- exact
                  ] :: [Integer]
    forM_ sources $ \i -> do
      putStrLn (showHFloat (fromInteger i :: Double) "")
  
  t17231 :: IO ()
  t17231 = do
    putStrLn (showHFloat (fromInteger $ 4141414141414141*4141414141414141 :: Double) "")
  
  t17782 :: IO ()
  t17782 = do
    let x = maxBound :: Word
    print (word2Double x == fromInteger (toInteger x))
  
  toFloat :: IO ()
  toFloat = do
    let sources = [ 0xFFFFFF8           -- round up
                  , 0xFFFFFF7F          -- round down
                  , 0xFFFFFF80          -- round up
                  , 0xFFFFFF7FF         -- round down
                  , 0xFFFFFF800         -- round up
                  , 0xFFFFFE800000000   -- round down
                  , 0xFFFFFF800000000   -- round up
                  , 0xFFFFFF7FFFFFFFF   -- round down
                  , 0xFFFFFF800000001   -- round up
                  , 0xFFFFFE8000000000  -- round down
                  , 0xFFFFFF8000000000  -- round up
                  , 0xFFFFFF7FFFFFFFFF  -- round down
                  , 0xFFFFFF8000000001  -- round up
                  ] :: [Integer]
    forM_ sources $ \i -> do
      putStrLn (showHFloat (fromInteger i :: Float) "")
    let x = maxBound :: Word
    print (word2Float x == fromInteger (toInteger x))
  
  main :: IO ()
  main = do
    t15926
    t17231
    t17782
    toFloat
  