Spec-Zone.ru › C

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)
1-3) Умножает значение с плавающей точкой arg на число 2 в степени exp.
4) Обобщённый по типу макрос: если 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

См. также

frexpfrexpffrexpl
(C99)(C99)
разбивает число на значащую часть и степень двойки
(функция)
scalbnscalbnfscalbnlscalblnscalblnfscalblnl
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API