
breal(+Number, -Result)

   Converts Number into a breal number and unifies it with Result.

Arguments
   Number              A number.
   Result              Output: bounded real number.

Type
   Arithmetic

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 --- Number is not instantiated (non-coroutining mode only).
    24 --- 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



See Also
   integer / 2, float / 2, rational / 2, is / 2, breal_min / 2, breal_max / 2, breal_bounds / 3, breal_from_bounds / 3, breal / 1, read_floats_as_breals
