logb

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)
(C99)
logb
(C99)
Classification
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)
Macro constants
 
Defined in header <math.h>
float       logbf( float arg );
(since C99)
double      logb( double arg );
(since C99)
long double logbl( long double arg );
(since C99)

Extracts the value of the exponent from the floating-point argument arg, and returns it as a floating-point value. Formally, the result is the integral part of log
r
|arg|
as a signed floating-point value, for non-zero arg, where r is FLT_RADIX. If arg is subnormal, it is treated as though it was normalized.

Contents

[edit] Parameters

arg - floating point value

[edit] Return value

The floating-point exponent.

Domain or range error may occur if arg is zero.

[edit] Notes

The value of the exponent returned by logb is always 1 less than the exponent retuned by frexp because of the different normalization requirements: for the exponent e returned by logb, |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 <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("logb(DBL_MIN)   = %+.1f\n", logb(DBL_MIN));
    printf("logb(DBL_MAX)   = %+.1f\n", logb(DBL_MAX));
    printf("logb(+INFINITY) = %+f\n",   logb(+INFINITY));
    printf("logb(-INFINITY) = %+f\n",   logb(-INFINITY));
    printf("logb(NAN)       = %f\n",    logb(NAN));
    printf("\n");
 
    /* "divide-by-zero" floating-point exception */
    /* same with logb(-0.0)                      */
    errno = 0; feclearexcept(FE_ALL_EXCEPT);
    printf("logb(0.0)      = %f\n",   logb(0.0));
    printf("%s\n",strerror(errno));
    show_fe_exceptions();
 
    return 0;
}

Possible output:

logb(DBL_MIN)   = -1022.0
logb(DBL_MAX)   = +1023.0
logb(+INFINITY) = +inf
logb(-INFINITY) = +inf
logb(NAN)       = nan
 
logb(0.0)      = -inf
Success
current exceptions raised:  FE_DIVBYZERO

[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)