Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
 
Definiert in der Header-Datei <cmath>
(1)
float         log1p ( float num );

double      log1p ( double num );

long double log1p ( long double num );
(bis C++23)
/* Gleitkommazahl-Typ */
            log1p ( /*Gleitkommazahltyp*/ num );
(seit C++23)
(constexpr seit C++26)
float        log1pf( float num );
(2) (seit C++11)
(constexpr seit C++26)
long double log1pl( long double num );
(3) (seit C++11)
(constexpr seit C++26)
SIMD-Überladung (seit C++26)
Definiert im Header <simd>
template< /*math-floating-point*/ V >

constexpr /*deduzierter-simd-t*/<V>

            log1p ( const V& v_num );
(S) (seit C++26)
Definiert in der Header-Datei <cmath>
template< class Integer >
double      log1p ( Integer num );
(A) (constexpr seit C++26)
1-3) Berechnet den natürlichen (Basis e) Logarithmus von 1 + num. Diese Funktion ist präziser als der Ausdruck std::log(1 + num), wenn num nahe Null ist. Die Bibliothek stellt Überladungen von std::log1p für alle cv-unqualifizierten Gleitkommatypen als Parametertyp bereit.(seit C++23)
S) Die SIMD-Überladung führt eine elementweise Anwendung von std::log1p auf v_num durch.
(Siehe math-floating-point und deduced-simd-t für ihre Definitionen.)
(seit C++26)
A) Zusätzliche Überladungen werden für alle ganzzahligen Typen bereitgestellt, die als double behandelt werden.
(seit C++11)

Inhalt

[edit] Parameter

num - Gleitkomma- oder Ganzzahlwert

[edit] Rückgabewert

Wenn keine Fehler auftreten, wird ln(1+num) zurückgegeben.

Wenn ein Domänenfehler auftritt, wird ein implementierungsabhängiger Wert zurückgegeben (NaN, wo unterstützt).

Wenn ein Pol-Fehler auftritt, werden -HUGE_VAL, -HUGE_VALF oder -HUGE_VALL zurückgegeben.

Wenn ein Bereichsfehler aufgrund eines Unterlaufs auftritt, wird das korrekte Ergebnis (nach Rundung) zurückgegeben.

[edit] Fehlerbehandlung

Fehler werden wie in math_errhandling beschrieben gemeldet.

Ein Definitionsbereichsfehler tritt auf, wenn num kleiner als -1 ist.

Ein Polfehler kann auftreten, wenn num gleich -1 ist.

Wenn die Implementierung IEEE-Gleitkomma-Arithmetik (IEC 60559) unterstützt,

  • Wenn das Argument ±0 ist, wird es unverändert zurückgegeben.
  • Wenn das Argument -1 ist, wird -∞ zurückgegeben und FE_DIVBYZERO ausgelöst.
  • Wenn das Argument kleiner als -1 ist, wird NaN zurückgegeben und FE_INVALID ausgelöst.
  • Wenn das Argument +∞ ist, wird +∞ zurückgegeben.
  • Wenn das Argument NaN ist, wird NaN zurückgegeben.

[edit] Anmerkungen

Die Funktionen std::expm1 und std::log1p sind für Finanzberechnungen nützlich, zum Beispiel bei der Berechnung kleiner täglicher Zinssätze: (1 + x)n
- 1
kann als std::expm1(n * std::log1p(x)) ausgedrückt werden. Diese Funktionen vereinfachen auch die genaue Schreibweise inverser hyperbolischer Funktionen.

Die zusätzlichen Überladungen müssen nicht notwendigerweise genau wie (A) bereitgestellt werden. Sie müssen nur ausreichen, um sicherzustellen, dass für ihr Argument num vom ganzzahligen Typ std::log1p(num) die gleiche Wirkung hat wie std::log1p(static_cast<double>(num)).

[edit] Beispiel

#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";
}

Mögliche Ausgabe

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

[edit] Siehe auch

(C++11)(C++11)
berechnet den natürlichen (Basis e) Logarithmus (ln(x))
(Funktion) [bearbeiten]
(C++11)(C++11)
berechnet den dekadischen (Basis 10) Logarithmus (log10(x))
(Funktion) [bearbeiten]
(C++11)(C++11)(C++11)
Basis 2 Logarithmus der gegebenen Zahl (log2(x))
(Funktion) [bearbeiten]
(C++11)(C++11)(C++11)
gibt e hoch der gegebenen Potenz minus 1 zurück (ex-1)
(Funktion) [bearbeiten]
C-Dokumentation für log1p