Defined in header <math.h> | ||
---|---|---|
float nextafterf( float from, float to ); | (1) | (since C99) |
double nextafter( double from, double to ); | (2) | (since C99) |
long double nextafterl( long double from, long double to ); | (3) | (since C99) |
float nexttowardf( float from, long double to ); | (4) | (since C99) |
double nexttoward( double from, long double to ); | (5) | (since C99) |
long double nexttowardl( long double from, long double to ); | (6) | (since C99) |
Defined in header <tgmath.h> | ||
#define nextafter(from, to) | (7) | (since C99) |
#define nexttoward(from, to) | (8) | (since C99) |
from
in the direction of to
. If from
equals to to
, to
is returned.from
in the direction of to
. If from
equals to to
, to
is returned, converted from long double
to the return type of the function without loss of range or precision.long double
, nextafterl
is called. Otherwise, if any argument has integer type or has type double
, nextafter
is called. Otherwise, nextafterf
is called.from
has type long double
, nexttowardl
is called. Otherwise, if from
has integer type or the type double
, nexttoward
is called. Otherwise, nexttowardf
is called.from, to | - | floating point values |
If no errors occur, the next representable value of from
in the direction of to
. is returned. If from
equals to
, then to
is returned, converted to the type of the function.
If a range error due to overflow occurs, ±HUGE_VAL
, ±HUGE_VALF
, or ±HUGE_VALL
is returned (with the same sign as from
).
If a range error occurs due to underflow, the correct result is returned.
Errors are reported as specified in math_errhandling
.
If the implementation supports IEEE floating-point arithmetic (IEC 60559),
from
is finite, but the expected result is an infinity, raises FE_INEXACT
and FE_OVERFLOW
from
does not equal to
and the result is subnormal or zero, raises FE_INEXACT
and FE_UNDERFLOW
from
or to
is NaN, NaN is returned POSIX specifies that the overflow and the underflow conditions are range errors (errno
may be set).
IEC 60559 recommends that from
is returned whenever from == to
. These functions return to
instead, which makes the behavior around zero consistent: nextafter(-0.0, +0.0)
returns +0.0
and nextafter(+0.0, -0.0)
returns -0.0
.
nextafter
is typically implemented by manipulation of IEEE representation (glibc musl).
#include <math.h> #include <stdio.h> #include <float.h> #include <fenv.h> int main(void) { float from1 = 0, to1 = nextafterf(from1, 1); printf("The next representable float after %.2f is %.20g (%a)\n", from1, to1, to1); float from2 = 1, to2 = nextafterf(from2, 2); printf("The next representable float after %.2f is %.20f (%a)\n", from2, to2, to2); double from3 = nextafter(0.1, 0), to3 = 0.1; printf("The number 0.1 lies between two valid doubles:\n" " %.56f (%a)\nand %.55f (%a)\n", from3, from3, to3, to3); // difference between nextafter and nexttoward: long double dir = nextafterl(from1, 1); // first subnormal long double float x = nextafterf(from1, dir); // first converts dir to float, giving 0 printf("Using nextafter, next float after %.2f (%a) is %.20g (%a)\n", from1, from1, x, x); x = nexttowardf(from1, dir); printf("Using nexttoward, next float after %.2f (%a) is %.20g (%a)\n", from1, from1, x, x); // special values { #pragma STDC FENV_ACCESS ON feclearexcept(FE_ALL_EXCEPT); double from4 = DBL_MAX, to4 = nextafter(from4, INFINITY); printf("The next representable double after %.2g (%a) is %.23f (%a)\n", from4, from4, to4, to4); if(fetestexcept(FE_OVERFLOW)) puts(" raised FE_OVERFLOW"); if(fetestexcept(FE_INEXACT)) puts(" raised FE_INEXACT"); } // end FENV_ACCESS block float from5 = 0.0, to5 = nextafter(from5, -0.0); printf("nextafter(+0.0, -0.0) gives %.2g (%a)\n", to5, to5); }
Output:
The next representable float after 0.00 is 1.4012984643248170709e-45 (0x1p-149) The next representable float after 1.00 is 1.00000011920928955078 (0x1.000002p+0) The number 0.1 lies between two valid doubles: 0.09999999999999999167332731531132594682276248931884765625 (0x1.9999999999999p-4) and 0.1000000000000000055511151231257827021181583404541015625 (0x1.999999999999ap-4) Using nextafter, next float after 0.00 (0x0p+0) is 0 (0x0p+0) Using nexttoward, next float after 0.00 (0x0p+0) is 1.4012984643248170709e-45 (0x1p-149) The next representable double after 1.8e+308 (0x1.fffffffffffffp+1023) is inf (inf) raised FE_OVERFLOW raised FE_INEXACT nextafter(+0.0, -0.0) gives -0 (-0x0p+0)
C++ documentation for nextafter |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/numeric/math/nextafter