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.