ldexp, ldexpf, ldexpl
Определено в заголовочном файле <math.h> | ||
|---|---|---|
float ldexpf( float arg, int exp ); | (1) | (начиная с C99) |
double ldexp( double arg, int exp ); | (2) | |
long double ldexpl( long double arg, int exp ); | (3) | (начиная с C99) |
Определено в заголовочном файле <tgmath.h> | ||
#define ldexp( arg, exp ) | (4) | (начиная с C99) |
arg на число 2 в степени exp.arg имеет тип long double, вызывается ldexpl. В противном случае, если arg имеет целочисленный тип или тип double, вызывается ldexp. В остальных случаях вызывается ldexpf соответственно.Параметры
| arg | - | значение с плавающей точкой |
| exp | - | целочисленное значение |
Возвращаемое значение
Если ошибки не возникают, возвращается arg, умноженное на 2 в степени exp (arg×2exp).
Если возникает ошибка диапазона из-за переполнения, возвращается ±HUGE_VAL, ±HUGE_VALF или ±HUGE_VALL.
Если возникает ошибка диапазона из-за потери значимости, возвращается правильный результат (после округления).
Обработка ошибок
Об ошибках сообщается в соответствии с описанием в math_errhandling.
Если реализация поддерживает арифметику с плавающей точкой IEEE (IEC 60559),
- Если ошибка диапазона не возникает,
FE_INEXACTникогда не устанавливается (результат точен) - Если ошибка диапазона не возникает, текущий режим округления игнорируется
- Если
argравен ±0, он возвращается без изменений - Если
argравен ±∞, он возвращается без изменений - Если
expравен 0,argвозвращается без изменений - Если
arg— NaN, возвращается NaN.
Примечания
В двоичных системах (где FLT_RADIX — это 2) ldexp эквивалентно scalbn.
Функцию ldexp («загрузить показатель степени») вместе с её обратной функцией frexp можно использовать для изменения представления числа с плавающей точкой без непосредственных манипуляций с битами.
Во многих реализациях ldexp менее эффективна, чем умножение или деление на степень двойки с помощью арифметических операторов.
Пример
#include <errno.h>
#include <fenv.h>
#include <float.h>
#include <math.h>
#include <stdio.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");
}
Возможный вывод:
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
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.12.6.6 Функции ldexp (стр.: TBD)
- 7.25 Обобщённая по типу математика <tgmath.h> (стр.: TBD)
- F.10.3.6 Функции ldexp (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.12.6.6 Функции ldexp (стр.: TBD)
- 7.25 Обобщённая по типу математика <tgmath.h> (стр.: TBD)
- F.10.3.6 Функции ldexp (стр.: TBD)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.12.6.6 Функции ldexp (стр.: 244)
- 7.25 Обобщённая по типу математика <tgmath.h> (стр.: 373-375)
- F.10.3.6 Функции ldexp (стр.: 522)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.12.6.6 Функции ldexp (стр.: 225)
- 7.22 Обобщённая по типу математика <tgmath.h> (стр.: 335-337)
- F.9.3.6 Функции ldexp (стр.: 459)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.5.4.3 Функция ldexp
См. также
|
(C99)(C99) | разбивает число на значащую часть и степень двойки (функция) |
|
(C99)(C99)(C99)(C99)(C99)(C99) | эффективно вычисляет произведение числа на FLT_RADIX в некоторой степени (функция) |
Документация C++ для ldexp |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/numeric/math/ldexp