On this page
ldexp, ldexpf, ldexpl
Defined in header <math.h> |
||
|---|---|---|
|
(1) | (since C99) |
|
(2) | |
|
(3) | (since C99) |
Defined in header <tgmath.h> |
||
|
(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.
Parameters
| arg | - | floating point value |
| exp | - | integer value |
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.
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_INEXACTis 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
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.
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
References
- C11 standard (ISO/IEC 9899:2011):
- 7.12.6.6 The ldexp functions (p: 244)
- 7.25 Type-generic math <tgmath.h> (p: 373-375)
- F.10.3.6 The ldexp functions (p: 522)
- C99 standard (ISO/IEC 9899:1999):
- 7.12.6.6 The ldexp functions (p: 225)
- 7.22 Type-generic math <tgmath.h> (p: 335-337)
- F.9.3.6 The ldexp functions (p: 459)
- C89/C90 standard (ISO/IEC 9899:1990):
- 4.5.4.3 The ldexp function
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 |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/numeric/math/ldexp