[ Arithmetic | Reference Manual | Alphabetic Index ]

breal(+Number, -Result)

Converts Number into a breal number and unifies it with Result.
Number
A number.
Result
Output: bounded real number.

Description

This predicate is used by the ECLiPSe compiler to expand evaluable arithmetic expressions. So the call to breal(Number, Result) is equivalent to
Result is breal(Number)
which should be preferred.

The exact operation depends on the argument type:

If Number is an integer, the result is a tight breal whose float bounds enclose the integer. If the integer's magnitude is small enough to be accurately representable with a float, those bounds will be identical and the breal will have zero width. For IEEE 754 double representation the threshold is 9007199254740992.

If Number is a rational, the result is a breal whose float bounds enclose the exact value of the rational.

If Number is a float, the result is a zero-width breal with both bounds identical to Number. No outward-rounding is done, because the system has no way of knowing how inexact the float argument is. It therefore makes the (unrealistic) assumption that the value is accurate. [To manually construct wider intervals from a float, use breal_from_bounds/3. Moreover, the parser can configured to read numeric constants directly as safely rounded breals; see syntax_option read_floats_as_breals]

If Number is a breal, the result is Number itself.

Note: The implementation may sometimes round conservatively and not give the tightest possible result.

Modes and Determinism

• breal(+, -) is det

Exceptions

(4) instantiation fault
Number is not instantiated (non-coroutining mode only).
(24) number expected
Number is not of a numeric type.

Examples

% small integers and floats are assumed to be accurate:
?- Result is breal(25).
Result = 25.0__25.0

?- Result is breal(1.5).
Result = 1.5__1.5

% rationals are conservatively rounded:
?- Result is breal(3_4).
Result = 0.74999999999999989__0.75000000000000011

% identity operation on breals:
?- Result is breal(1.0__1.01).
Result = 1.0__1.01

% rounding with large integers:
?- Result is breal(9999999999999999).
Result = 9999999999999998.0__10000000000000002.0