Module scale

This module provides access to decimal numbers. Among the ordinary access to decimal numbers that is available both for unlimited and limited precision decimal numbers, we also find access that is specific to limited precision decimal numbers. A decimal number is represented as follows according to the Java BigDecimal class:

D = V * U * 10^(-S)
V : The sign, -1, 0 or 1
U : The unscaled value from the Java BigInteger class.
S : The scale from the Java int class.

For limited precision decimal numbers the order of magnitude of the unscaled value is determined as well. This is called the precision of the decimal number and it is independent of the scale of the decimal number. During limited precision arithmetic the precision is limited by a requested precision from a math context:

10^(P-1) <= U < 10^P
P : The precision

The evaluable functions scale/2, unscaled_value/2 and new_decimal/3 allow accessing and creating an unlimited or limited decimal number. The evaluable functions precision/2 and requested/2 allow accessing the current precision of a decimal number and the requested precision through a math context.

The following elementary evaluable functions are provided:

scale(X, S):
Predicate succeeds in S with the scale of the decimal number X.
unscaled_value(X, U):
Predicate succeeds in U with the unscaled value of the decimal number X.
new_decimal(U, S, D):
The predicate succeeds in D with a decimal of unscaled value U and scale S.
precision(X, P):
Predicate succeeds in P with the precision of the decimal number X.
requested(C, P):
Predicate succeeds in P with requested precision by the math context C.
new_context(P, C):
Predicate succeeds in C with a new math context of requested precision P.