std::nextafter,std::nextafterf,std::nextafterl,std::nexttoward,std::nexttowardf, (3) Linux Manual Page
std::nextafter,std::nextafterf,std::nextafterl,std::nexttoward,std::nexttowardf, – std::nextafter,std::nextafterf,std::nextafterl,std::nexttoward,std::nexttowardf,
Synopsis
Defined in header
float nextafter
float nextafterf(
double nextafter
long double nextafter
long double nextafterl(
Promoted nextafter
float nexttoward
float nexttowardf(
double nexttoward
long double nexttoward
long double nexttowardl(
double nexttoward
Returns the next representable value of from in the direction of to.
1-3) If from equals to to, to is returned.
5-7) 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.
4) A set of overloads or a function template for all combinations of arguments of
arithmetic type not covered by (1-3). If any argument has integral type, it is cast
to double. If any argument is long double, then the return type Promoted is also
long double, otherwise the return type is always double.
8) A set of overloads or a function template accepting the from argument of any
integral type. Equivalent to (6) (the argument is cast to double).
Parameters
from, to – floating point values
Return value
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.
If a range error due to overflow occurs,
returned
If a range error occurs due to underflow, the correct result is returned.
Error handling
Errors are reported as specified in math_errhandling.
If the implementation supports IEEE floating-point arithmetic
Notes
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: std::nextafter(-0.0,
+0.0)
Example
// Run this code
#include <cmath>
#include <iomanip>
#include <iostream>
#include <cfloat>
#include <cfenv>
int main()
{
float from1 = 0, to1 = std::nextafter(from1, 1.f);
std::cout << "The next representable float after " << std::setprecision(20) << from1
<< " is " << to1
<< std::hexfloat << " (" << to1 << ")\n"
<< std::defaultfloat;
float from2 = 1, to2 = std::nextafter(from2, 2.f);
std::cout << "The next representable float after " << from2 << " is " << to2
<< std::hexfloat << " (" << to2 << ")\n"
<< std::defaultfloat;
double from3 = std::nextafter(0.1, 0), to3 = 0.1;
std::cout << "The number 0.1 lies between two valid doubles:\n"
<< std::setprecision(56) << " " << from3
<< std::hexfloat << " (" << from3 << ')' << std::defaultfloat
<< "\nand " << to3 << std::hexfloat << " (" << to3 << ")\n"
<< std::defaultfloat << std::setprecision(20);
// difference between nextafter and nexttoward:
long double dir = std::nextafter(from1, 1.0L); // first subnormal long double
float x = nextafter(from1, dir); // first converts dir to float, giving 0
std::cout << "With nextafter, next float after " << from1 << " is " << x << '\n';
x = std::nexttoward(from1, dir);
std::cout << "With nexttoward, next float after " << from1 << " is " << x << '\n';
// special values
{
#pragma STDC FENV_ACCESS ON
std::feclearexcept(FE_ALL_EXCEPT);
double from4 = DBL_MAX, to4 = std::nextafter(from4, INFINITY);
std::cout << "The next representable double after " << std::setprecision(6)
<< from4 << std::hexfloat << " (" << from4 << ')'
<< std::defaultfloat << " is " << to4
<< std::hexfloat << " (" << to4 << ")\n"
<< std::defaultfloat;
if (std::fetestexcept(FE_OVERFLOW))
std::cout << " raised FE_OVERFLOW\n";
if (std::fetestexcept(FE_INEXACT))
std::cout << " raised FE_INEXACT\n";
} // end FENV_ACCESS block
float from5 = 0.0, to5 = std::nextafter(from5, -0.0);
std::cout << "std::nextafter(+0.0, -0.0) gives " << std::fixed << to5 << '\n';
}
Output:
