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) |
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)
См. также
|
(C99)(C99) | разбивает число на мантиссу и степень 2 (функция) |
|
(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