Spec-Zone.ru › C++

std::log1p, std::log1pf, std::log1pl

Определено в заголовке <cmath>
(1)
float       log1p ( float num );
double      log1p ( double num );
long double log1p ( long double num );
(до 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)
Дополнительные перегрузки (с C++11)
Определено в заголовке <cmath>
template< class Integer >
double      log1p ( Integer num );
(A) (constexpr с C++26)
1-3) Вычисляет натуральный (по основанию e) логарифм 1 + num. Эта функция более точна, чем выражение std::log(1 + num) если num близко к нулю. Библиотека предоставляет перегрузки std::log1p для всех типов с плавающей точкой без квалификаторов cv в качестве типа параметра.(с C++23)
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). Они должны быть достаточны для того, чтобы для их первого аргумента num1 и второго аргумента num2:

  • Если num1 или num2 имеет тип long double, то std::log1p(num1, num2) имеет тот же эффект, что и std::log1p(static_cast<long double>(num1), static_cast<long double>(num2)).
  • В противном случае, если num1 и/или num2 имеет тип double или целочисленный тип, то std::log1p(num1, num2) имеет тот же эффект, что и std::log1p(static_cast<double>(num1), static_cast<double>(num2)).
  • В противном случае, если num1 или num2 имеет тип float, то std::log1p(num1, num2) имеет тот же эффект, что и std::log1p(static_cast<float>(num1), static_cast<float>(num2)).
(до C++23)

Если num1 и num2 имеют арифметические типы, то std::log1p(num1, num2) имеет тот же эффект, что и std::log1p(static_cast</* common-floating-point-type */>(num1), static_cast</* common-floating-point-type */>(num2)), где /* common-floating-point-type */ — тип с плавающей точкой с наибольшим рангом преобразования с плавающей точкой и наибольшим подрангом преобразования с плавающей точкой между типами num1 и num2, аргументы целочисленного типа считаются имеющими тот же ранг преобразования с плавающей точкой, что и double.

Если такого типа с плавающей точкой с наибольшим рангом и подрангом не существует, то разрешение перегрузки не приводит к применимому кандидату из предоставленных перегрузок.

(с C++23)

Пример

#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

См. также

loglogflogl
(C++11)(C++11)
вычисляет натуральный (по основанию e) логарифм (\({\small\ln{x}}\)ln(x))
(функция)
log10log10flog10l
(C++11)(C++11)
вычисляет десятичный (по основанию 10) логарифм (\({\small\log_{10}{x}}\)log10(x))
(функция)
log2log2flog2l
(C++11)(C++11)(C++11)
логарифм по основанию 2 данного числа (\({\small\log_{2}{x}}\)log2(x))
(функция)
expm1expm1fexpm1l
(C++11)(C++11)(C++11)
возвращает e, возведенное в заданную степень, минус единицу (\({\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/w/cpp/numeric/math/log1p

Spec-Zone.ru

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