DecimalSourceThis is an implementation of decimal floating point arithmetic based on the General Decimal Arithmetic Specification:
http://speleotrove.com/decimal/decarith.html
and IEEE standard 854-1987:
http://en.wikipedia.org/wiki/IEEE_854-1987
Decimal floating point has finite precision with arbitrarily large bounds. The purpose of this module is to support arithmetic using familiar "schoolhouse" rules and to avoid some of the tricky representation issues associated with binary floating point. The package is especially useful for financial applications or for contexts where users have expectations that are at odds with binary floating point (for instance, in binary floating point, 1.00 mod 0.1 gives 0.09999999999999995 instead of 0.0; Decimal.(of_string "1.00" mod of_string "0.1") returns the expected "0.00").
Signals are used to control the behaviour of the decimal functions under exceptional conditions.
Settings that control precision, rounding mode, exceptional behaviour, etc.
A decimal floating-point number. All operations are done in radix (base) 10.
of_float ?context float is the decimal representation of the float. This suffers from floating-point precision loss; the other constructors should be preferred.
to_tuple t is a representation of the internals of t as a triple of (sign, coefficient, exponent) for debugging purposes.
abs ?round ?context t is the absolute value of t, rounded only if round is true.
negate ?context t is t negated, and rounded under context if necessary.
div_rem ?context t1 t2 is (t1 / t2, t1 mod t2).
fma ?context ~first_mul ~then_add t is fused multiple-add: t * first_mul + then_add with no rounding of the intermediate product.
t and first_mul are multiplied together, then then_add is added to the product, then a final rounding is performed.