rounding variants floor, ceil and truncate for floating point operations +-*/√…
There is an exact definition for
+-*/√ over the real numbers in
mathematics. However for performant, flexible and ergonomic numerical
computations one ought to restrict oneself only having a finite subset
of rational numbers. The most common data type for such use cases is
the single and double floating point format.
Combining two real floating point numbers by an operator yield a
mathematical and exactly defined result. This exact result might not
be representable as a floating point number. One has to round. The
most common way of rounding is rounding to the nearest representable
float. This rounding variant helps to minimize the accumulation of
rounding errors over several floating point operations.
Other rounding variants floor, ceil and truncate are useful for
computing error bounds of chained floating point instructions. floor
chooses the lesser neighbor of the representable results. ceil chooses
the greater float. truncate chooses the float that is closest to zero.
This library implements the floating point instructions in pure
hasekell. They do not use `c++` with
fegetround for example.
That way they can be used in the WebAssembly backend of ghc since
WebAssembly does neither support rounding variants nor
fegetround.
This module is supposed to expose the fastest possible clean interface
of rounding variants. Should there ever be some compiler intrinsics
for rounding variants then these shall be used in a future version.
Internally the module heavily utilizes the
Rational data type.
First the operations result is calculated twice. One time exact with
the help of
Rational. Then there is also a
round-to-nearest-even-on-tie result calculated. After that both
numbers are compared to investigate if the
round-to-nearest-even-on-tie result was rounded in the correct
direction by chance. Should that not be the case the other neighbor is
determined and returned.
Every combination of number type (
Float,
Double) and
operator (
+,
-,
*,
/,
√,
id) is
exported separately. The exported functions are supposed to be useful
for interval arithmetic.