Compute the next representable double-precision floating-point number
#include <math.h>
double nextafter ( double x,
double y);
float nextafterf ( float x,
float y );
The nextafter() and nextafterf() functions compute the next representable double-precision floating-point value following x in the direction of y.
The next machine floating-point number of x in the direction towards y.
| If: | nextafter() returns: |
|---|---|
| y < x | The next possible floating-point value less than y |
| y > x | The next possible floating-point value greater than x |
| x is NAN | NAN |
| y is NAN | NAN |
| x is finite | ±HUGE_VAL, according to the sign of x (errno is set) |
#include <stdio.h>
#include <errno.h>
#include <inttypes.h>
#include <math.h>
#include <fpstatus.h>
void dump_to_hex(double d) {
printf("0x%08x %08x \n",
(uint32_t)(*((uint64_t*)&d) >> 32),
(uint32_t)(*((uint64_t*)&d)));
}
int main(int argc, char** argv)
{
double a, b, c;
a = 0 ;
b = nextafter(a, -1);
c = nextafter(a, 1);
printf("Next possible value before %f is %f \n", a, b);
printf("-->"); dump_to_hex(a);
printf("-->"); dump_to_hex(b);
printf("Next possible value after %f is %f \n", a, c);
printf("-->"); dump_to_hex(a);
printf("-->"); dump_to_hex(c);
return(0);
}
produces the output:
Next possible value before 0.000000 is 0.000000 -->0x00000000 00000000 -->0x80000000 00000001 Next possible value after 0.000000 is 0.000000 -->0x00000000 00000000
| Safety: | |
|---|---|
| Cancellation point | No |
| Interrupt handler | No |
| Signal handler | No |
| Thread | Yes |