[ Arithmetic | Reference Manual | Alphabetic Index ]

nexttoward(+X, +Y, -Result)

Next representable number
A number
A number
Output: number


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


(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.


      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

      Result is nexttoward(3_4, 2_1).	% type error

See Also

is / 2, abs / 2, sgn / 2