ldexp, ldexpf, ldexpl
| Defined in header
<math.h>
|
||
| float ldexpf( float arg, int exp );
|
(1) | (since C99) |
| double ldexp( double arg, int exp );
|
(2) | |
| long double ldexpl( long double arg, int exp );
|
(3) | (since C99) |
| Defined in header
<tgmath.h>
|
||
| #define ldexp( arg, exp )
|
(4) | (since C99) |
arg by the number 2 raised to the exp power.arg has type long double, ldexpl is called. Otherwise, if arg has integer type or the type double, ldexp is called. Otherwise, ldexpf is called, respectively.
Contents |
[edit] Parameters
| arg | - | floating point value |
| exp | - | integer value |
[edit] Return value
If no errors occur, arg multiplied by 2 to the power of exp (arg×2exp
) is returned.
If a range error due to overflow occurs, ±HUGE_VAL, ±HUGE_VALF, or ±HUGE_VALL is returned.
If a range error due to underflow occurs, the correct result (after rounding) is returned.
[edit] Error handling
Errors are reported as specified in math_errhandling
If the implementation supports IEEE floating-point arithmetic (IEC 60559),
- Unless a range error occurs, FE_INEXACT is never raised (the result is exact)
- Unless a range error occurs, the current rounding mode is ignored
- If
argis ±0, it is returned, unmodified - If
argis ±∞, it is returned, unmodified - If
expis 0, thenargis returned, unmodified - If
argis NaN, NaN is returned
[edit] Notes
On binary systems (where FLT_RADIX is 2), ldexp is equivalent to scalbn.
The function ldexp ("load exponent"), together with its dual, frexp, can be used to manipulate the representation of a floating-point number without direct bit manipulations.
On many implementations, ldexp is less efficient than multiplication or division by a power of two using arithmetic operators.
[edit] Example
#include <stdio.h> #include <math.h> #include <float.h> #include <errno.h> #include <fenv.h> #pragma STDC FENV_ACCESS ON int main(void) { printf("ldexp(7, -4) = %f\n", ldexp(7, -4)); printf("ldexp(1, -1074) = %g (minimum positive subnormal double)\n", ldexp(1, -1074)); printf("ldexp(nextafter(1,0), 1024) = %g (largest finite double)\n", ldexp(nextafter(1,0), 1024)); // special values printf("ldexp(-0, 10) = %f\n", ldexp(-0.0, 10)); printf("ldexp(-Inf, -1) = %f\n", ldexp(-INFINITY, -1)); //error handling errno = 0; feclearexcept(FE_ALL_EXCEPT); printf("ldexp(1, 1024) = %f\n", ldexp(1, 1024)); if(errno == ERANGE) perror(" errno == ERANGE"); if(fetestexcept(FE_OVERFLOW)) puts(" FE_OVERFLOW raised"); }
Possible output:
ldexp(7, -4) = 0.437500
ldexp(1, -1074) = 4.94066e-324 (minimum positive subnormal double)
ldexp(nextafter(1,0), 1024) = 1.79769e+308 (largest finite double)
ldexp(-0, 10) = -0.000000
ldexp(-Inf, -1) = -inf
ldexp(1, 1024) = inf
errno == ERANGE: Numerical result out of range
FE_OVERFLOW raised[edit] See also
| (C99)(C99)
|
breaks a number into significand and a power of 2 (function) |
| (C99)(C99)(C99)(C99)(C99)(C99)
|
computes efficiently a number times FLT_RADIX raised to a power (function) |
|
C++ documentation for ldexp
|
|