std::log1p, std::log1pf, std::log1pl
Определено в заголовочном файле <cmath> | ||
|---|---|---|
float log1p ( float num ); double log1p ( double num ); long double log1p ( long double num ); | (1) | (до C++23) |
/*floating-point-type*/
log1p ( /*floating-point-type*/ num );
|
(начиная с C++23) (constexpr начиная с C++26) | |
float log1pf( float num ); | (2) |
(начиная с C++11) (constexpr начиная с C++26) |
long double log1pl( long double num ); | (3) |
(начиная с C++11) (constexpr начиная с C++26) |
| Перегрузка SIMD (начиная с C++26) | ||
Определено в заголовочном файле <simd> | ||
template< /*math-floating-point*/ V >
constexpr /*deduced-simd-t*/<V>
log1p ( const V& v_num );
| (S) | (начиная с C++26) |
| Дополнительные перегрузки (начиная с C++11) | ||
Определено в заголовочном файле <cmath> | ||
template< class Integer > double log1p ( Integer num ); | (A) | (constexpr начиная с C++26) |
1 + num. Эта функция обеспечивает более высокую точность, чем выражение std::log(1 + num), если num близко к нулю. Библиотека предоставляет перегрузки std::log1p для всех типов с плавающей точкой, не имеющих квалификаторов cv, в качестве типа параметра.(начиная с C++23)
S) Перегрузка SIMD выполняет поэлементное std::log1p над v_num. (Определения см. в разделах math-floating-point и deduced-simd-t.) | (начиная с C++26) |
| A) Предоставляются дополнительные перегрузки для всех целочисленных типов, которые рассматриваются как double. | (начиная с C++11) |
Параметры
| num | - | значение с плавающей точкой или целочисленное значение |
Возвращаемое значение
Если ошибки не возникают, возвращается ln(1+num).
Если возникает ошибка области определения, возвращается значение, определяемое реализацией (NaN, если поддерживается).
Если возникает ошибка полюса, возвращается -HUGE_VAL, -HUGE_VALF или -HUGE_VALL.
Если возникает ошибка диапазона из-за потери порядка, возвращается правильный результат (после округления).
Обработка ошибок
Об ошибках сообщается согласно math_errhandling.
Ошибка области определения возникает, если num меньше -1.
Ошибка полюса может возникнуть, если num равен -1.
Если реализация поддерживает арифметику с плавающей точкой IEEE (IEC 60559),
- Если аргумент равен ±0, он возвращается без изменений.
- Если аргумент равен -1, возвращается -∞ и устанавливается
FE_DIVBYZERO. - Если аргумент меньше -1, возвращается NaN и устанавливается
FE_INVALID. - Если аргумент равен +∞, возвращается +∞.
- Если аргумент равен NaN, возвращается NaN.
Примечания
Функции std::expm1 и std::log1p полезны для финансовых вычислений, например при расчёте небольших ежедневных процентных ставок: (1 + x)n - 1 можно выразить как std::expm1(n * std::log1p(x)). Эти функции также упрощают запись точных обратных гиперболических функций.
Дополнительные перегрузки не обязательно должны быть предоставлены в точности в виде (A). Достаточно, чтобы они обеспечивали для аргумента num целочисленного типа, что std::log1p(num) действует так же, как std::log1p(static_cast<double>(num)).
Пример
#include <cerrno>
#include <cfenv>
#include <cmath>
#include <cstring>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
int main()
{
std::cout << "log1p(0) = " << log1p(0) << '\n'
<< "Interest earned in 2 days on $100, compounded daily at 1%\n"
<< " on a 30/360 calendar = "
<< 100 * expm1(2 * log1p(0.01 / 360)) << '\n'
<< "log(1+1e-16) = " << std::log(1 + 1e-16)
<< ", but log1p(1e-16) = " << std::log1p(1e-16) << '\n';
// special values
std::cout << "log1p(-0) = " << std::log1p(-0.0) << '\n'
<< "log1p(+Inf) = " << std::log1p(INFINITY) << '\n';
// error handling
errno = 0;
std::feclearexcept(FE_ALL_EXCEPT);
std::cout << "log1p(-1) = " << std::log1p(-1) << '\n';
if (errno == ERANGE)
std::cout << " errno == ERANGE: " << std::strerror(errno) << '\n';
if (std::fetestexcept(FE_DIVBYZERO))
std::cout << " FE_DIVBYZERO raised\n";
}
Возможный вывод:
log1p(0) = 0
Interest earned in 2 days on $100, compounded daily at 1%
on a 30/360 calendar = 0.00555563
log(1+1e-16) = 0, but log1p(1e-16) = 1e-16
log1p(-0) = -0
log1p(+Inf) = inf
log1p(-1) = -inf
errno == ERANGE: Result too large
FE_DIVBYZERO raised
См. также
|
(C++11)(C++11) | вычисляет натуральный логарифм (по основанию e) (\({\small\ln{x}}\)ln(x)) (функция) |
|
(C++11)(C++11) | вычисляет десятичный логарифм (по основанию 10) (\({\small\log_{10}{x}}\)log10(x)) (функция) |
|
(C++11)(C++11)(C++11) | логарифм заданного числа по основанию 2 (\({\small\log_{2}{x}}\)log2(x)) (функция) |
|
(C++11)(C++11)(C++11) | возвращает e в заданной степени минус 1 (\({\small e^x-1}\)ex-1) (функция) |
Документация по C для log1p |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/math/log1p