Break a floating-point number into a normalized fraction and an integral power of 2
#include <math.h> double frexp( double value, int* exp ); float frexpf( float value, int* exp ); long double frexp( long double value, int* exp );
These functions break a floating-point number into a normalized fraction and an integral power of 2. It stores the integral power of 2 in the int pointed to by exp.
To check for error situations, use feclearexcept() and fetestexcept(). For example:
A number, x, that has a magnitude in the interval [0.5, 1.0] or is 0.0, such that value = x * 2exp.
If value is: | These functions return: | *exp | Errors: |
---|---|---|---|
±0.0 | 0.0, with the same sign as value | 0 | — |
±Inf | value | Unspecified | — |
NaN | value | Unspecified | — |
These functions raise FE_INEXACT if the FPU reports that the result can't be exactly represented as a floating-point number.
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <fenv.h> int main( void ) { int expon; double value; int except_flags; feclearexcept(FE_ALL_EXCEPT); value = frexp( 4.25, &expon ); printf( "%f %d\n", value, expon ); except_flags = fetestexcept(FE_ALL_EXCEPT); if(except_flags) { /* An error occurred; handle it appropriately. */ } feclearexcept(FE_ALL_EXCEPT); value = frexp( -4.25, &expon ); printf( "%f %d\n", value, expon ); except_flags = fetestexcept(FE_ALL_EXCEPT); if(except_flags) { /* An error occurred; handle it appropriately. */ } return EXIT_SUCCESS; }
produces the output:
0.531250 3 -0.531250 3
Safety: | |
---|---|
Cancellation point | No |
Interrupt handler | No |
Signal handler | No |
Thread | Yes |