Namespaces
Variants

std:: logb, std:: logbf, std:: logbl

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)
logb
(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 logb ( float num ) ;

double logb ( double num ) ;

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

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

logb ( const V & v_num ) ;
(S) (depuis C++26)
Défini dans l'en-tête <cmath>
template < class Integer >
double logb ( Integer num ) ;
(A) (constexpr depuis C++23)
1-3) Extrait la valeur de l'exposant indépendant de la base et non biaisé de l'argument à virgule flottante num , et la retourne comme valeur flottante. La bibliothèque fournit des surcharges de std::logb pour tous les types à virgule flottante non qualifiés cv comme type du paramètre. (depuis C++23)
S) La surcharge SIMD effectue un std::logb é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 .
(since C++11)

Formellement, l'exposant non biaisé est la partie entière signée de log r |num| (retournée par cette fonction comme valeur flottante), pour un num non nul, où r est std:: numeric_limits < T > :: radix et T est le type flottant de num . Si num est sous-normal, il est traité comme s'il était normalisé.

Table des matières

Paramètres

num - valeur à virgule flottante ou entière

Valeur de retour

Si aucune erreur ne se produit, l'exposant non biaisé de num est renvoyé comme une valeur en virgule flottante signée.

Si une erreur de domaine se produit, une valeur définie par l'implémentation est retournée.

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

Gestion des erreurs

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

Une erreur de domaine ou de plage peut survenir si num est nul.

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

  • Si num est ±0, -∞ est retourné et FE_DIVBYZERO est déclenché.
  • Si num est ±∞, +∞ est retourné.
  • Si num est NaN, NaN est retourné.
  • Dans tous les autres cas, le résultat est exact ( FE_INEXACT n'est jamais déclenché) et le mode d'arrondi actuel est ignoré.

Notes

POSIX exige qu'une erreur de pôle se produise si num est ±0.

La valeur de l'exposant retourné par std::logb est toujours inférieure de 1 à l'exposant retourné par std::frexp en raison des différentes exigences de normalisation : pour l'exposant e retourné par std::logb , |num*r -e
|
est compris entre 1 et r (typiquement entre 1 et 2 ), mais pour l'exposant e retourné par std::frexp , |num*2 -e
|
est compris entre 0.5 et 1 .

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

Exemple

Compare différentes fonctions de décomposition en virgule flottante :

#include <cfenv>
#include <cmath>
#include <iostream>
#include <limits>
// #pragma STDC FENV_ACCESS ON
int main()
{
    double f = 123.45;
    std::cout << "Given the number " << f << " or " << std::hexfloat
              << f << std::defaultfloat << " in hex,\n";
    double f3;
    double f2 = std::modf(f, &f3);
    std::cout << "modf() makes " << f3 << " + " << f2 << '\n';
    int i;
    f2 = std::frexp(f, &i);
    std::cout << "frexp() makes " << f2 << " * 2^" << i << '\n';
    i = std::ilogb(f);
    std::cout << "logb()/ilogb() make " << f / std::scalbn(1.0, i) << " * "
              << std::numeric_limits<double>::radix
              << "^" << std::ilogb(f) << '\n';
    // error handling
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "logb(0) = " << std::logb(0) << '\n';
    if (std::fetestexcept(FE_DIVBYZERO))
        std::cout << "    FE_DIVBYZERO raised\n";
}

Sortie possible :

Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123 + 0.45
frexp() makes 0.964453 * 2^7
logb()/ilogb() make 1.92891 * 2^6
logb(0) = -Inf
    FE_DIVBYZERO raised

Voir aussi

(C++11) (C++11)
décompose un nombre en mantisse et exposant de base 2
(fonction)
(C++11) (C++11) (C++11)
extrait l'exposant du nombre
(fonction)
(C++11) (C++11) (C++11) (C++11) (C++11) (C++11)
multiplie un nombre par FLT_RADIX élevé à une puissance
(fonction)