Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- type SafeDouble = DoubleRelAbs 10 10
- newtype DoubleRelAbs (abs :: Nat) (rel :: Nat) = DoubleRelAbs Double
Documentation
type SafeDouble = DoubleRelAbs 10 10 Source #
Relatively safe double floating-point type with a relative error
margin of 10 ULPs
and an absolute margin around zero of
10*epsilon
.
Warning: All numbers within
10*epsilon
of zero will be considered zero.
>>>
m_epsilon * 10
2.220446049250313e-15
>>>
realToFrac (m_epsilon * 10) == (0::SafeDouble)
False
>>>
realToFrac (m_epsilon * 9) == (0::SafeDouble)
True
>>>
1e-20 == (5e-20 :: Double)
False>>>
1e-20 == (5e-20 :: SafeDouble)
True
pi
and sin
are approximations:
>>>
sin pi
1.2246467991473532e-16
>>>
sin pi == (0 :: Double)
False
>>>
sin pi == (0 :: SafeDouble)
True
newtype DoubleRelAbs (abs :: Nat) (rel :: Nat) Source #
Custom double floating-point type with a relative error margin of
rel
number of
ULPs and an
absolute error margin of abs
times
epsilon.
The relative error margin is the primary tool for good numerical robustness and can relatively safely be set to a high number such as 100. The absolute error margin is a last ditch attempt at fixing broken algorithms and dramatically limits the resolution around zero. If possible, use a low absolute error margin.