Library
Module
Module type
Parameter
Class
Class type
This 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").
module Signal : sig ... end
Signals are used to control the behaviour of the decimal functions under exceptional conditions.
module Context : sig ... end
Settings that control precision, rounding mode, exceptional behaviour, etc.
include Map.OrderedType with type t := t
A total ordering function over the keys. This is a two-argument function f
such that f e1 e2
is zero if the keys e1
and e2
are equal, f e1 e2
is strictly negative if e1
is smaller than e2
, and f e1 e2
is strictly positive if e1
is greater than e2
. Example: a suitable ordering function is the generic structural comparison function Stdlib.compare
.
include Hashtbl.HashedType with type t := t
val hash : t -> int
A hashing function on keys. It must be such that if two keys are equal according to equal
, then they have identical hash values as computed by hash
. Examples: suitable (equal
, hash
) pairs for arbitrary key types include
(=)
, hash
) for comparing objects by structure (provided objects do not contain floats)(fun x y -> compare x y = 0)
, hash
) for comparing objects by structure and handling Stdlib.nan
correctly(==)
, hash
) for comparing objects by physical equality (e.g. for mutable or cyclic objects).val infinity : t
val neg_infinity : t
val nan : t
val one : t
val zero : t
val is_nan : t -> bool
val is_finite : t -> bool
val is_infinite : t -> bool
val is_signed : t -> bool
val is_integral : t -> bool
is_integral t
is whether t
is an integer (whole number) or not.
val of_int : int -> t
of_yojson json
is the result of parsing a JSON value into a decimal:
of_float ?context float
is the decimal representation of the float
. This suffers from floating-point precision loss; the other constructors should be preferred.
val to_bool : t -> bool
val to_yojson : t -> [> `String of string ]
to_yojson t
is the JSON representation of decimal value t
. Note that it is encoded as a string to avoid losing precision.
to_float ?context decimal
is the float representation of the decimal
. This suffers from floating-point precision loss; the other serializations should be preferred.
val pp : Format.formatter -> t -> unit
val to_tuple : t -> int * string * int
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
.
val adjusted : t -> int
adjusted t
is the exponent of t
after adjusting its coefficient (significand) into standard form, i.e. scientific notation.
E.g., Decimal.("314" |> of_string |> adjusted)
is 2 because it is 3.14e2 in standard form. And, Decimal.("42e-10" |> of_string |> adjusted)
is -9 because it is 4.2e-9 in standard form.
negate ?context t
is t
negated, and rounded under context
if necessary.
Opposite of negate
; t
's sign is left unchanged but t
is rounded under context
if necessary.
val quantize : ?context:Context.t -> ?round:Context.round -> exp:t -> t -> t
quantize ?context ?round ~exp t
is t
quantized so that its exponent is the same as that of exp
.
round ?n t
is t
rounded to the nearest integer, or to a given precision. If n
is None
, round t
to the nearest integer. If t
lies exactly halfway between two integers then it is rounded to the even integer.
shift ?context t1 t2
shifts t1
by t2
decimal places, where t2
must be integral.
val sign : t -> int
sign t
is -1
if t is negative, and 1
otherwise.
fma ?context ~first_mul ~then_add t
is fused multiply-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.
scaleb ?context t1 t2
returns t1
after scaling its exponent by t2
.