Spec-Zone.ru › C++

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-3) Вычисляет натуральный логарифм (по основанию e) от 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

См. также

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 в заданной степени минус 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

Spec-Zone.ru

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