scalbn, scalbln
From cppreference.com
Defined in header
<math.h>
|
||
float scalbnf( float arg, int exp );
|
(since C99) | |
double scalbn( double arg, int exp );
|
(since C99) | |
long double scalbnl( long double arg, int exp );
|
(since C99) | |
float scalblnf( float arg, long exp );
|
(since C99) | |
double scalbln( double arg, long exp );
|
(since C99) | |
long double scalblnl( long double arg, long exp );
|
(since C99) | |
Multiplies a floating point value arg
by FLT_RADIX raised to power exp
. On binary systems it is equivalent to ldexp().
Contents |
[edit] Parameters
arg | - | floating point value |
exp | - | integer value |
[edit] Return value
Returns arg×FLT_RADIXexp
.
If the result is too large for the underlying type, range error occurs and HUGE_VAL is returned.
[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("FLT_RADIX = %d\n", FLT_RADIX); printf("\n"); printf("scalbn(1.0,+1023) = %g\n", scalbn(1.0,+1023)); /* 1 * 2^(+1023) */ printf("scalbn(1.0,-1074) = %g\n", scalbn(1.0,-1074)); /* 1 * 2^(-1074) */ printf("scalbn(5.0,0) = %+.1f\n", scalbn(5.0,0)); /* 5 * 2^0 */ printf("scalbn(+0.0,1) = %+.1f\n", scalbn(+0.0,1)); /* 0 * 2^1 */ printf("scalbn(-0.0,1) = %+.1f\n", scalbn(-0.0,1)); printf("scalbn(+INFINITY,1) = %+f\n", scalbn(+INFINITY,1)); /* INFINITY * 2^1 */ printf("scalbn(-INFINITY,1) = %+f\n", scalbn(-INFINITY,1)); printf("\n"); /* "inexact" and "overflow" floating-point exceptions */ /* Overflow does not set errno. */ /* 1 * 2^(+1024) */ errno = 0; feclearexcept(FE_ALL_EXCEPT); printf("scalbn(1.0,1024) = %f\n", scalbn(1.0,1024)); printf("%s\n",strerror(errno)); show_fe_exceptions(); printf("\n"); /* "inexact" and "underflow" floating-point exceptions */ /* Underflow does not set errno. */ /* 1 * 2^(-1075) */ errno = 0; feclearexcept(FE_ALL_EXCEPT); printf("scalbn(1.0,-1075) = %g\n", scalbn(1.0,-1075)); printf("%s\n",strerror(errno)); show_fe_exceptions(); return 0; }
Possible output:
FLT_RADIX = 2 scalbn(1.0,1023) = 8.98847e+307 scalbn(1.0,-1074) = 4.94066e-324 scalbn(5.0,0) = +5.0 scalbn(+0.0,1) = +0.0 scalbn(-0.0,1) = -0.0 scalbn(+INFINITY,1) = +inf scalbn(-INFINITY,1) = -inf scalbn(1.0,1024) = inf Success current exceptions raised: FE_INEXACT FE_OVERFLOW scalbn(1.0,-1075) = 0 Success current exceptions raised: FE_INEXACT FE_UNDERFLOW
[edit] See also
(C99)(C99)
|
breaks a number into significand and a power of 2 (function) |
(C99)(C99)
|
multiplies a number by 2 raised to a power (function) |
C++ documentation for scalbn
|