ilogb

From cppreference.com
< c‎ | numeric‎ | math
 
 
 
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)
Exponential functions
(C99)
(C99)
(C99)
(C99)
Power functions
(C99)
(C99)
Trigonometric and hyperbolic functions
(C99)
(C99)
(C99)
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Nearest integer floating point operations
(C99)(C99)(C99)
(C99)
(C99)
(C99)(C99)(C99)
Floating point manipulation functions
(C99)(C99)
ilogb
(C99)
(C99)
Classification
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)
Macro constants
 
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