-- Test that we don't have rules (or othre optimisations) doing the
-- wrong thing for constant folding with Doubles.
module Main (main) where
zero :: Double
zero = 0
one :: Double
one = 1
nan :: Double
nan = 0 / 0
inf :: Double
inf = 1 / 0
neginf :: Double
neginf = -1 / 0
fzero :: Float
fzero = 0
fone :: Float
fone = 1
fnan :: Float
fnan = 0 / 0
finf :: Float
finf = 1 / 0
fneginf :: Float
fneginf = -1 / 0
main :: IO ()
main = do putStrLn "=== Subtraction ==="
print (zero - zero)
print (zero - nan)
print (zero - inf)
print (zero - neginf)
print (nan - zero)
print (nan - nan)
print (nan - inf)
print (nan - neginf)
print (inf - zero)
print (inf - nan)
print (inf - inf)
print (inf - neginf)
print (neginf - zero)
print (neginf - nan)
print (neginf - inf)
print (neginf - neginf)
putStrLn "=== Addition ==="
print (zero + zero)
print (zero + nan)
print (zero + inf)
print (zero + neginf)
print (nan + zero)
print (nan + nan)
print (nan + inf)
print (nan + neginf)
print (inf + zero)
print (inf + nan)
print (inf + inf)
print (inf + neginf)
print (neginf + zero)
print (neginf + nan)
print (neginf + inf)
print (neginf + neginf)
putStrLn "=== Mutiplication ==="
print (zero * zero)
print (zero * one)
print (zero * nan)
print (zero * inf)
print (zero * neginf)
print (one * zero)
print (one * one)
print (one * nan)
print (one * inf)
print (one * neginf)
print (nan * zero)
print (nan * one)
print (nan * nan)
print (nan * inf)
print (nan * neginf)
print (inf * zero)
print (inf * one)
print (inf * nan)
print (inf * inf)
print (inf * neginf)
print (neginf * zero)
print (neginf * one)
print (neginf * nan)
print (neginf * inf)
print (neginf * neginf)
putStrLn "=== Division ==="
print (zero / zero)
print (zero / one)
print (zero / nan)
print (zero / inf)
print (zero / neginf)
print (one / zero)
print (one / one)
print (one / nan)
print (one / inf)
print (one / neginf)
print (nan / zero)
print (nan / one)
print (nan / nan)
print (nan / inf)
print (nan / neginf)
print (inf / zero)
print (inf / one)
print (inf / nan)
print (inf / inf)
print (inf / neginf)
print (neginf / zero)
print (neginf / one)
print (neginf / nan)
print (neginf / inf)
print (neginf / neginf)
putStrLn "=== Subtraction ==="
print (fzero - fzero)
print (fzero - fnan)
print (fzero - finf)
print (fzero - fneginf)
print (fnan - fzero)
print (fnan - fnan)
print (fnan - finf)
print (fnan - fneginf)
print (finf - fzero)
print (finf - fnan)
print (finf - finf)
print (finf - fneginf)
print (fneginf - fzero)
print (fneginf - fnan)
print (fneginf - finf)
print (fneginf - fneginf)
putStrLn "=== Addition ==="
print (fzero + fzero)
print (fzero + fnan)
print (fzero + finf)
print (fzero + fneginf)
print (fnan + fzero)
print (fnan + fnan)
print (fnan + finf)
print (fnan + fneginf)
print (finf + fzero)
print (finf + fnan)
print (finf + finf)
print (finf + fneginf)
print (fneginf + fzero)
print (fneginf + fnan)
print (fneginf + finf)
print (fneginf + fneginf)
putStrLn "=== Mutiplication ==="
print (fzero * fzero)
print (fzero * fone)
print (fzero * fnan)
print (fzero * finf)
print (fzero * fneginf)
print (fone * fzero)
print (fone * fone)
print (fone * fnan)
print (fone * finf)
print (fone * fneginf)
print (fnan * fzero)
print (fnan * fone)
print (fnan * fnan)
print (fnan * finf)
print (fnan * fneginf)
print (finf * fzero)
print (finf * fone)
print (finf * fnan)
print (finf * finf)
print (finf * fneginf)
print (fneginf * fzero)
print (fneginf * fone)
print (fneginf * fnan)
print (fneginf * finf)
print (fneginf * fneginf)
putStrLn "=== Division ==="
print (fzero / fzero)
print (fzero / fone)
print (fzero / fnan)
print (fzero / finf)
print (fzero / fneginf)
print (fone / fzero)
print (fone / fone)
print (fone / fnan)
print (fone / finf)
print (fone / fneginf)
print (fnan / fzero)
print (fnan / fone)
print (fnan / fnan)
print (fnan / finf)
print (fnan / fneginf)
print (finf / fzero)
print (finf / fone)
print (finf / fnan)
print (finf / finf)
print (finf / fneginf)
print (fneginf / fzero)
print (fneginf / fone)
print (fneginf / fnan)
print (fneginf / finf)
print (fneginf / fneginf)