expm1, expm1f, expm1l
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Определено в заголовке
<math.h>
|
||
|
float
expm1f
(
float
arg
)
;
|
(1) | (начиная с C99) |
|
double
expm1
(
double
arg
)
;
|
(2) | (начиная с C99) |
|
long
double
expm1l
(
long
double
arg
)
;
|
(3) | (начиная с C99) |
|
Определено в заголовке
<tgmath.h>
|
||
|
#define expm1( arg )
|
(4) | (начиная с C99) |
2.7182818
), возведенное в заданную степень
arg
, минус
1.0
. Эта функция точнее, чем выражение
exp
(
arg
)
-
1.0
, если
arg
близко к нулю.
arg
имеет тип
long
double
,
expm1l
вызывается. В противном случае, если
arg
имеет целочисленный тип или тип
double
,
expm1
вызывается. В противном случае
expm1f
вызывается.
Содержание |
Параметры
| arg | - | значение с плавающей запятой |
Возвращаемое значение
Если ошибок не возникает,
e
arg
-1
возвращается.
Если происходит ошибка диапазона из-за переполнения,
+HUGE_VAL
,
+HUGE_VALF
, или
+HUGE_VALL
возвращается.
Если происходит ошибка диапазона из-за потери значимости (underflow), возвращается корректный результат (после округления).
Обработка ошибок
Ошибки сообщаются, как указано в math_errhandling .
Если реализация поддерживает арифметику с плавающей запятой IEEE (IEC 60559),
- Если аргумент равен ±0, он возвращается без изменений
- Если аргумент равен -∞, возвращается -1
- Если аргумент равен +∞, возвращается +∞
- Если аргумент равен NaN, возвращается NaN
Примечания
Функции
expm1
и
log1p
полезны для финансовых расчетов, например, при вычислении небольших ежедневных процентных ставок:
(1+x)
n
-1
может быть выражено как
expm1
(
n
*
log1p
(
x
)
)
. Эти функции также упрощают написание точных обратных гиперболических функций.
Для IEEE-совместимого типа double переполнение гарантировано, если 709.8 < arg .
Пример
#include <errno.h> #include <fenv.h> #include <float.h> #include <math.h> #include <stdio.h> // #pragma STDC FENV_ACCESS ON int main(void) { printf("expm1(1) = %f\n", expm1(1)); printf("Interest earned in 2 days on $100, compounded daily at 1%%\n" " on a 30/360 calendar = %f\n", 100*expm1(2*log1p(0.01/360))); printf("exp(1e-16)-1 = %g, but expm1(1e-16) = %g\n", exp(1e-16)-1, expm1(1e-16)); // special values printf("expm1(-0) = %f\n", expm1(-0.0)); printf("expm1(-Inf) = %f\n", expm1(-INFINITY)); //error handling errno = 0; feclearexcept(FE_ALL_EXCEPT); printf("expm1(710) = %f\n", expm1(710)); if (errno == ERANGE) perror(" errno == ERANGE"); if (fetestexcept(FE_OVERFLOW)) puts(" FE_OVERFLOW raised"); }
Возможный вывод:
expm1(1) = 1.718282
Interest earned in 2 days on $100, compounded daily at 1%
on a 30/360 calendar = 0.005556
exp(1e-16)-1 = 0, but expm1(1e-16) = 1e-16
expm1(-0) = -0.000000
expm1(-Inf) = -1.000000
expm1(710) = inf
errno == ERANGE: Result too large
FE_OVERFLOW raised
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 7.12.6.3 Функции expm1 (стр.: TBD)
-
- 7.25 Обобщённая математика <tgmath.h> (стр.: TBD)
-
- F.10.3.3 Функции expm1 (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.12.6.3 Функции expm1 (стр. 177)
-
- 7.25 Обобщенная математика <tgmath.h> (стр. 272-273)
-
- F.10.3.3 Функции expm1 (стр. 379)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.12.6.3 Функции expm1 (стр. 243)
-
- 7.25 Обобщенная математика <tgmath.h> (стр. 373-375)
-
- F.10.3.3 Функции expm1 (стр. 521)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.12.6.3 Функции expm1 (стр. 223-224)
-
- 7.22 Обобщенная математика <tgmath.h> (стр. 335-337)
-
- F.9.3.3 Функции expm1 (стр. 458)
Смотрите также
|
(C99)
(C99)
|
вычисляет
e
в заданной степени (
\({\small e^x}\)
e
x
)
(функция) |
|
(C99)
(C99)
(C99)
|
вычисляет
2
в заданной степени (
\({\small 2^x}\)
2
x
)
(функция) |
|
(C99)
(C99)
(C99)
|
вычисляет натуральный (по основанию
e
) логарифм 1 плюс заданное число (
\({\small \ln{(1+x)} }\)
ln(1+x)
)
(функция) |
|
Документация C++
для
expm1
|
|