Spec-Zone.ru › C

scalbn, scalbnf, scalbnl, scalbln, scalblnf, scalblnl

Определено в заголовочном файле <math.h>
float       scalbnf( float arg, int exp );
(1) (с C99)
double      scalbn( double arg, int exp );
(2) (с C99)
long double scalbnl( long double arg, int exp );
(3) (с C99)
Определено в заголовочном файле <tgmath.h>
#define scalbn( arg, exp )
(4) (с C99)
Определено в заголовочном файле <math.h>
float       scalblnf( float arg, long exp );
(5) (с C99)
double      scalbln( double arg, long exp );
(6) (с C99)
long double scalblnl( long double arg, long exp );
(7) (с C99)
Определено в заголовочном файле <tgmath.h>
#define scalbln( arg, exp )
(8) (с C99)
1-3,5-7) Умножает значение с плавающей точкой arg на FLT_RADIX в степени exp.
4,8) Универсальные макросы: Если arg имеет тип long double, вызывается scalbnl или scalblnl. В противном случае, если arg имеет целочисленный тип или тип double, scalbn или scalbln вызывается. В противном случае, соответственно вызываются scalbnf или scalblnf.

Параметры

arg - значение с плавающей точкой
exp - целое значение

Возвращаемое значение

Если ошибок нет, возвращается arg умноженное на FLT_RADIX в степени exp (arg×FLT_RADIXexp).

Если произошла ошибка переполнения, возвращается ±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), scalbn эквивалентно ldexp.

Хотя scalbn и scalbln предназначены для эффективного выполнения операции, во многих реализациях они менее эффективны, чем умножение или деление на степень двойки с использованием арифметических операторов.

Функция scalbln предоставлена, потому что множитель, необходимый для масштабирования от наименьшего положительного значения с плавающей точкой до наибольшего конечного, может быть больше 32767, гарантируемой стандартом INT_MAX. В частности, для 80-битного long double множитель равен 32828.

Пример

#include <errno.h>
#include <fenv.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
 
// #pragma STDC FENV_ACCESS ON
 
int main(void)
{
    printf("scalbn(7, -4) = %f\n", scalbn(7, -4));
    printf("scalbn(1, -1074) = %g (minimum positive subnormal double)\n",
            scalbn(1, -1074));
    printf("scalbn(nextafter(1,0), 1024) = %g (largest finite double)\n",
            scalbn(nextafter(1,0), 1024));
 
    // special values
    printf("scalbn(-0, 10) = %f\n", scalbn(-0.0, 10));
    printf("scalbn(-Inf, -1) = %f\n", scalbn(-INFINITY, -1));
 
    // error handling
    errno = 0; feclearexcept(FE_ALL_EXCEPT);
    printf("scalbn(1, 1024) = %f\n", scalbn(1, 1024));
    if (errno == ERANGE)
        perror("    errno == ERANGE");
    if (fetestexcept(FE_OVERFLOW))
        puts("    FE_OVERFLOW raised");
}

Возможный вывод:

scalbn(7, -4) = 0.437500
scalbn(1, -1074) = 4.94066e-324 (minimum positive subnormal double)
scalbn(nextafter(1,0), 1024) = 1.79769e+308 (largest finite double)
scalbn(-0, 10) = -0.000000
scalbn(-Inf, -1) = -inf
scalbn(1, 1024) = inf
    errno == ERANGE: Numerical result out of range
    FE_OVERFLOW raised

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2023):
    • 7.12.6.13 Функции scalbn (p: TBD)
    • 7.25 Универсальная математика <tgmath.h> (p: TBD)
    • F.10.3.13 Функции scalbn (p: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • 7.12.6.13 Функции scalbn (p: TBD)
    • 7.25 Универсальная математика <tgmath.h> (p: TBD)
    • F.10.3.13 Функции scalbn (p: TBD)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.12.6.13 Функции scalbn (p: 247)
    • 7.25 Универсальная математика <tgmath.h> (p: 373-375)
    • F.10.3.13 Функции scalbn (p: 523)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.12.6.13 Функции scalbn (p: 228)
    • 7.22 Универсальная математика <tgmath.h> (p: 335-337)
    • F.9.3.13 Функции scalbn (p: 460)

См. также

frexpfrexpffrexpl
(C99)(C99)
разбивает число на мантиссу и степень 2
(функция)
ldexpldexpfldexpl
(C99)(C99)
умножает число на 2 в степени
(функция)
Документация C++ для scalbn

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/numeric/math/scalbn

Spec-Zone.ru

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