[ Arithmetic | Reference Manual | Alphabetic Index ]
# nexttoward(+X, +Y, -Result)

Next representable number
*X*
- A number
*Y*
- A number
*Result*
- Output: number

## Description

This predicate is used by the ECLiPSe compiler to expand evaluable
arithmetic expressions. So the call to nexttoward(Y, X, Result) is
equivalent to
Result is nexttoward(X, Y)

which should be preferred for portability.
Result is the next representable number following X in the direction
of Y. If Y is greater than X, the result is the smallest representable
number greater than X. If Y is smaller than X, the result is the
greatest representable number smaller than X. Otherwise the result
is identical to X or Y.

If X and Y are floats, the next representable value depends on the
floating point representation.

If X and Y are integers, the next representable value is the next integer.

If X and Y are breals, the result is the smallest interval enclosing
all possible results of doing the operation on elements of the input
intervals.

If X and Y are rationals, the operation is undefined.

If X and Y are of different types, the types are first made equal
(via conversions integer -> rational -> float -> breal),
then the result is computed as above.

In coroutining mode, if X or Y is uninstantiated, the predicate delays.

### Modes and Determinism

- nexttoward(+, +, -) is det

### Exceptions

*(4) instantiation fault *
- X or Y is not instantiated (non-coroutining mode only).
*(5) type error *
- Operation not defined on rational numbers
*(24) number expected *
- Number is not of a numeric type.

## Examples

Success:
Result is nexttoward(1.0, 2.0). % gives Result = 1.0000000000000002
Result is nexttoward(1.0, 0.0). % gives Result = 0.99999999999999989
Result is nexttoward(1.0, 1.0). % gives Result = 1.0
Result is nexttoward(0.0, 1.0). % gives Result = 4.94065645841247e-324
Result is nexttoward(1.0Inf, 0.0) % gives Result = 1.7976931348623157e+308
Result is nexttoward(5, 9). % gives Result = 6
Result is nexttoward(5, 0). % gives Result = 4
Result is nexttoward(5, 5). % gives Result = 5
Error:
Result is nexttoward(3_4, 2_1). % type error

## See Also

is / 2, abs / 2, sgn / 2