ilogb
Defined in header
<math.h>
|
||
int ilogbf( float arg );
|
(since C99) | |
int ilogb( double arg );
|
(since C99) | |
int ilogbl( long double arg );
|
(since C99) | |
#define FP_ILOGB0 /*implementation-defined*/
|
(since C99) | |
#define FP_ILOGBNAN /*implementation-defined*/
|
(since C99) | |
Extracts the value of the exponent from the floating-point argument arg
, and returns it as a signed integer value. Formally, the result is the integral part of log
r|arg| as a signed integral value, for non-zero arg, where r
is FLT_RADIX.
Contents |
[edit] Parameters
arg | - | floating point value |
[edit] Return value
The floating-point exponent, cast to integer.
Domain or range error may occur if arg
is zero, FP_ILOGB0 is returned in that case.
Domain or range error may occur if arg
is infinite, INT_MAX is returned in that case.
Domain or range error may occur if arg
is NaN, FP_ILOGBNAN is returned in that case.
If the result cannot be represented as int, the result is undefined.
[edit] Notes
The value of the exponent returned by ilogb is always 1 less than the exponent retuned by frexp because of the different normalization requirements: for the exponent e
returned by ilogb, |arg*r-e
| is between 1 and r
(typically between 1 and 2), but for the exponent e
returned by frexp, |arg*2-e
| is between 0.5 and 1.
[edit] Example
#include <stdio.h> #include <math.h> #include <fenv.h> #include <errno.h> #include <float.h> #include <limits.h> #include <string.h> #pragma STDC FENV_ACCESS ON void show_fe_exceptions(void) { printf("current exceptions raised: "); if(fetestexcept(FE_DIVBYZERO)) printf(" FE_DIVBYZERO"); if(fetestexcept(FE_INEXACT)) printf(" FE_INEXACT"); if(fetestexcept(FE_INVALID)) printf(" FE_INVALID"); if(fetestexcept(FE_OVERFLOW)) printf(" FE_OVERFLOW"); if(fetestexcept(FE_UNDERFLOW)) printf(" FE_UNDERFLOW"); if(fetestexcept(FE_ALL_EXCEPT)==0) printf(" none"); printf("\n"); } int main(void) { printf("FP_ILOGB0 = %+d\n", FP_ILOGB0); printf("FP_ILOGBNAN = %+d\n", FP_ILOGBNAN); printf("INT_MAX = %+d\n", INT_MAX); printf("\n"); printf("ilogb(DBL_MIN) = %+d\n", ilogb(DBL_MIN)); printf("ilogb(DBL_MAX) = %+d\n", ilogb(DBL_MAX)); printf("\n"); errno = 0; feclearexcept(FE_ALL_EXCEPT); printf("ilogb(0.0) = %d\n", ilogb(0.0)); printf("%s\n",strerror(errno)); show_fe_exceptions(); printf("\n"); errno = 0; feclearexcept(FE_ALL_EXCEPT); printf("ilogb(INFINITY) = %d\n", ilogb(INFINITY)); printf("%s\n",strerror(errno)); show_fe_exceptions(); printf("\n"); errno = 0; feclearexcept(FE_ALL_EXCEPT); printf("ilogb(NAN) = %d\n", ilogb(NAN)); printf("%s\n",strerror(errno)); show_fe_exceptions(); return 0; }
Possible output:
FP_ILOGB0 = -2147483648 FP_ILOGBNAN = -2147483648 INT_MAX = +2147483647 ilogb(DBL_MIN) = -1022 ilogb(DBL_MAX) = +1023 ilogb(0.0) = -2147483648 Success current exceptions raised: none ilogb(INFINITY) = 2147483647 Success current exceptions raised: none ilogb(NAN) = -2147483648 Success current exceptions raised: none
[edit] See also
(C99)(C99)
|
breaks a number into significand and a power of 2 (function) |
(C99)(C99)(C99)
|
extracts exponent of the given number (function) |
(C99)(C99)(C99)(C99)(C99)(C99)
|
computes efficiently a number times FLT_RADIX raised to a power (function) |
C++ documentation for ilogb
|