logb
From cppreference.com
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
Run this code
#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) |
C++ documentation for logb
|