Namespaces
Variants

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

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
Défini dans l'en-tête <cmath>
(1)
float log1p ( float num ) ;

double log1p ( double num ) ;

long double log1p ( long double num ) ;
(jusqu'à C++23)
/*floating-point-type*/
log1p ( /*floating-point-type*/ num ) ;
(depuis C++23)
(constexpr depuis C++26)
float log1pf ( float num ) ;
(2) (depuis C++11)
(constexpr depuis C++26)
long double log1pl ( long double num ) ;
(3) (depuis C++11)
(constexpr depuis C++26)
Surcharge SIMD (depuis C++26)
Défini dans l'en-tête <simd>
template < /*math-floating-point*/ V >

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

log1p ( const V & v_num ) ;
(S) (depuis C++26)
Défini dans l'en-tête <cmath>
template < class Integer >
double log1p ( Integer num ) ;
(A) (constexpr depuis C++26)
1-3) Calcule le logarithme naturel (base- e ) de 1 + num . Cette fonction est plus précise que l'expression std:: log ( 1 + num ) si num est proche de zéro. La bibliothèque fournit des surcharges de std::log1p pour tous les types à virgule flottante non qualifiés cv comme type du paramètre. (depuis C++23)
S) La surcharge SIMD effectue un calcul std::log1p élément par élément sur v_num .
(Voir math-floating-point et deduced-simd-t pour leurs définitions.)
(depuis C++26)
A) Des surcharges supplémentaires sont fournies pour tous les types entiers, qui sont traités comme double .
(depuis C++11)

Table des matières

Paramètres

num - valeur à virgule flottante ou entière

Valeur de retour

Si aucune erreur ne se produit ln(1+num) est retourné.

Si une erreur de domaine se produit, une valeur définie par l'implémentation est retournée (NaN là où supporté).

Si une erreur de pôle se produit, -HUGE_VAL , -HUGE_VALF , ou -HUGE_VALL est retourné.

Si une erreur de plage se produit en raison d'un dépassement inférieur, le résultat correct (après arrondi) est retourné.

Gestion des erreurs

Les erreurs sont signalées comme spécifié dans math_errhandling .

Une erreur de domaine se produit si num est inférieur à -1 .

Une erreur de pôle peut se produire si num est -1 .

Si l'implémentation prend en charge l'arithmétique à virgule flottante IEEE (IEC 60559),

  • Si l'argument est ±0, il est retourné inchangé.
  • Si l'argument est -1, -∞ est retourné et FE_DIVBYZERO est déclenché.
  • Si l'argument est inférieur à -1, NaN est retourné et FE_INVALID est déclenché.
  • Si l'argument est +∞, +∞ est retourné.
  • Si l'argument est NaN, NaN est retourné.

Notes

Les fonctions std::expm1 et std::log1p sont utiles pour les calculs financiers, par exemple lors du calcul de petits taux d'intérêt quotidiens : (1 + x) n
- 1
peut être exprimé comme std:: expm1 ( n * std :: log1p ( x ) ) . Ces fonctions simplifient également l'écriture de fonctions hyperboliques inverses précises.

Les surcharges supplémentaires ne sont pas tenues d'être fournies exactement comme (A) . Elles doivent seulement être suffisantes pour garantir que pour leur argument num de type entier, std :: log1p ( num ) ait le même effet que std :: log1p ( static_cast < double > ( num ) ) .

Exemple

#include <cerrno>
#include <cfenv>
#include <cmath>
#include <cstring>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
int main()
{
    std::cout << "log1p(0) = " << log1p(0) << '\n'
              << "Intérêt gagné en 2 jours sur 100$, composé quotidiennement à 1%\n"
              << "    sur un calendrier 30/360 = "
              << 100 * expm1(2 * log1p(0.01 / 360)) << '\n'
              << "log(1+1e-16) = " << std::log(1 + 1e-16)
              << ", mais log1p(1e-16) = " << std::log1p(1e-16) << '\n';
    // valeurs spéciales
    std::cout << "log1p(-0) = " << std::log1p(-0.0) << '\n'
              << "log1p(+Inf) = " << std::log1p(INFINITY) << '\n';
    // gestion des erreurs
    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 déclenchée\n";
}

Sortie possible :

log1p(0) = 0
Intérêt gagné en 2 jours sur 100$, composé quotidiennement à 1%
    sur un calendrier 30/360 = 0.00555563
log(1+1e-16) = 0, mais log1p(1e-16) = 1e-16
log1p(-0) = -0
log1p(+Inf) = inf
log1p(-1) = -inf
    errno == ERANGE: Résultat trop grand
    FE_DIVBYZERO déclenchée

Voir aussi

(C++11) (C++11)
calcule le logarithme naturel (base e ) ( ln(x) )
(fonction)
(C++11) (C++11)
calcule le logarithme décimal (base 10 ) ( log 10 (x) )
(fonction)
(C++11) (C++11) (C++11)
logarithme en base 2 du nombre donné ( log 2 (x) )
(fonction)
(C++11) (C++11) (C++11)
renvoie e élevé à la puissance donnée, moins 1 ( e x -1 )
(fonction)