logb, logbf, logbl

Header: <math.h>

1-3) Extracts the value of the unbiased radix-independent exponent from the floating-point argument arg, and returns it as a floating-point value.

# Declarations

float logbf( float arg );

(since C99)

double logb( double arg );

(since C99)

long double logbl( long double arg );

(since C99)

#define logb( arg )

(since C99)

# Parameters

# Return value

If no errors occur, the unbiased exponent of arg is returned as a signed floating-point value.

# Notes

POSIX requires that a pole error occurs if arg is ±0.

The value of the exponent returned by logb is always 1 less than the exponent returned by frexp because of the different normalization requirements: for the exponent e returned by logb, |argr-e| is between 1 and r (typically between 1 and 2), but for the exponent e returned by frexp, |arg2-e| is between 0.5 and 1.

# Example

#include <fenv.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
// #pragma STDC FENV_ACCESS ON
 
int main(void)
{
    double f = 123.45;
    printf("Given the number %.2f or %a in hex,\n", f, f);
 
    double f3;
    double f2 = modf(f, &f3);
    printf("modf() makes %.0f + %.2f\n", f3, f2);
 
    int i;
    f2 = frexp(f, &i);
    printf("frexp() makes %f * 2^%d\n", f2, i);
 
    i = logb(f);
    printf("logb()/logb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i);
 
    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    printf("logb(0) = %f\n", logb(0));
    if (fetestexcept(FE_DIVBYZERO))
        puts("    FE_DIVBYZERO raised");
}

# See also