|
|
|
Defined in header <math.h> | ||
float logbf(float arg); | (1) | (since C99) |
double logb(double arg); | (2) | (since C99) |
longdouble logbl(longdouble arg); | (3) | (since C99) |
Defined in header <tgmath.h> | ||
#define logb( arg ) | (4) | (since C99) |
logbl
is called. Otherwise, ifarg has integer type or the typedouble,logb
is called. Otherwise,logbf
is called.Formally, the unbiased exponent is the signed integral part oflogr|arg| (returned by this function as a floating-point value), for non-zeroarg, wherer
isFLT_RADIX. Ifarg is subnormal, it is treated as though it was normalized.
Contents |
arg | - | floating-point value |
If no errors occur, the unbiased exponent ofarg is returned as a signed floating-point value.
If a domain error occurs, an implementation-defined value is returned.
If a pole error occurs,-HUGE_VAL,-HUGE_VALF
, or-HUGE_VALL
is returned.
Errors are reported as specified inmath_errhandling
.
Domain or range error may occur ifarg is zero.
If the implementation supports IEEE floating-point arithmetic (IEC 60559),
POSIX requires that a pole error occurs ifarg is ±0.
The value of the exponent returned bylogb
is always1 less than the exponent returned byfrexp because of the different normalization requirements: for the exponente
returned bylogb
,|arg*r-e
| is between1 andr
(typically between1 and2), but for the exponente
returned byfrexp,|arg*2-e
| is between0.5 and1.
Compares different floating-point decomposition functions.
#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 handlingfeclearexcept(FE_ALL_EXCEPT);printf("logb(0) = %f\n", logb(0));if(fetestexcept(FE_DIVBYZERO))puts(" FE_DIVBYZERO raised");}
Possible output:
Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,modf() makes 123 + 0.45frexp() makes 0.964453 * 2^7logb()/logb() make 1.928906 * 2^6logb(0) = -Inf FE_DIVBYZERO raised
(C99)(C99) | breaks a number into significand and a power of2 (function)[edit] |
(C99)(C99)(C99) | extracts exponent of the given number (function)[edit] |
(C99)(C99)(C99)(C99)(C99)(C99) | computes efficiently a number timesFLT_RADIX raised to a power (function)[edit] |
C++ documentation forlogb |