-- | This module contains rules that break the way NaN is handled for "Float" -- and "Double" types. Still, these rules should be safe in the vast majority of -- applications. -- -- Importing this module is similar to compiling with gcc's @-fno-signaling-nans@ -- and @-ffinite-math-only@. -- module Numeric.FastMath.NaN where import GHC.Exts {-# RULES "minusDouble x x" forall x. (-##) x x = 0.0## "timesDouble 0 x" forall x. (*##) 0.0## x = 0.0## "timesDouble x 0" forall x. (*##) x 0.0## = 0.0## "divideDouble x 1" forall x. (/##) x 1.0## = x "divideDouble x -1" forall x. (/##) x (-1.0##) = negateDouble# x "divideDouble 0 x" forall x. (/##) 0.0## x = 0.0## #-} {-# RULES "minusFloat x x" forall x. minusFloat# x x = 0.0# "timesFloat x 0" forall x. timesFloat# x 0.0# = 0.0# "timesFloat 0 x" forall x. timesFloat# 0.0# x = 0.0# "divideFloat x 1" forall x. divideFloat# x 1.0# = x "divideFloat x -1" forall x. divideFloat# x (-1.0#) = negateFloat# x "divideFloat 0 x" forall x. divideFloat# 0.0# x = 0.0# #-}