Stability | experimental |
---|---|

Maintainer | Patrick Perry <patperry@stanford.edu> |

Approximate comparison of floating point numbers based on the algorithm in Section 4.2.2 of Knuth's _Seminumerical Algorithms_ and NaN-aware minimum and maximum.

Relative accuracy within `eps`

is measured using an interval of size `2*r`

,
where `r = 2^k eps`

, and `k`

is the maximum exponent of `x`

and `y`

. If
`x`

and `y`

lie within this interval, they are considered approximately
equal.

Note that `x`

and `y`

are compared to relative accuracy, so these functions
are not suitable for testing whether a value is approximately zero.

The implementation is based on the GNU Scientific Library implementation,
which is based on the package `fcmp`

by T.C. Belding.

- maxF :: RealFloat a => a -> a -> a
- minF :: RealFloat a => a -> a -> a
- delta :: RealFloat a => a
- epsilon :: RealFloat a => a
- epsilon' :: RealFloat a => a
- eqRel :: RealFloat a => a -> a -> a -> Bool
- neqRel :: RealFloat a => a -> a -> a -> Bool
- ltRel :: RealFloat a => a -> a -> a -> Bool
- lteRel :: RealFloat a => a -> a -> a -> Bool
- gtRel :: RealFloat a => a -> a -> a -> Bool
- gteRel :: RealFloat a => a -> a -> a -> Bool
- compareRel :: RealFloat a => a -> a -> a -> Ordering

# NaN-aware minimum and maximum

maxF :: RealFloat a => a -> a -> aSource

A version of `max`

that returns `NaN`

if either argument is `NaN`

.

minF :: RealFloat a => a -> a -> aSource

A version of `min`

that returns `NaN`

if either argument is `NaN`

.

# Relative comparisons

delta :: RealFloat a => aSource

A value suitable for relative comparisons when half of of the
digits of precision are important. For `Double`

s this value is
`7.450580596923828e-9`

.

epsilon :: RealFloat a => aSource

The smallest positive floating-point number x such that `1 + x != 1`

.
Suitable for relative comparisons when all but the least significant digit
of precision are important. For `Double`

s this value is
`2.220446049250313e-16`

.

epsilon' :: RealFloat a => aSource

The smallest positive floating-point number x such that `1 - x != 1`

.
Suitable for relative comparisons when one number is exact and all but the
least significant digit of precision in the other number are important.
For `Double`

s this value is `1.1102230246251565e-16`

.

eqRel :: RealFloat a => a -> a -> a -> BoolSource

`eqRel eps x y`

. Relative equality comparator.
Returns `False`

if either argument is `NaN`

.

neqRel :: RealFloat a => a -> a -> a -> BoolSource

`neqRel eps x y`

. Relative inequality comparator.
Returns `False`

if either argument is `NaN`

.

ltRel :: RealFloat a => a -> a -> a -> BoolSource

`ltRel eps x y`

. Relative less-than comparator.
Returns `False`

if either argument is `NaN`

.

lteRel :: RealFloat a => a -> a -> a -> BoolSource

`lteRel eps x y`

. Relative less-than-or-equal-to comparator.
Returns `False`

if either argument is `NaN`

.

gtRel :: RealFloat a => a -> a -> a -> BoolSource

`gtRel eps x y`

. Relative greater-than comparator.
Returns `False`

if either argument is `NaN`

.

gteRel :: RealFloat a => a -> a -> a -> BoolSource

`gteRel eps x y`

. Relative greater-than-or-equal-to comparator.
Returns `False`

if either argument is `NaN`

.

compareRel :: RealFloat a => a -> a -> a -> OrderingSource

`compareRel eps x y`

gives an ordering of `x`

and `y`

based on a
relative comparison of accuracy `eps`

. This will call `error`

if either
argument is `NaN`

.