Namespaces
Variants

std:: ilogb, std:: ilogbf, std:: ilogbl

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

int ilogb ( double num ) ;

int ilogb ( long double num ) ;
(depuis C++11)
(jusqu'à C++23)
constexpr int ilogb ( /* floating-point-type */ num ) ;
(depuis C++23)
int ilogbf ( float num ) ;
(2) (depuis C++11)
(constexpr depuis C++23)
int ilogbl ( long double num ) ;
(3) (depuis C++11)
(constexpr depuis C++23)
#define FP_ILOGB0   /* implementation-defined */
(4) (depuis C++11)
#define FP_ILOGBNAN /* implementation-defined */
(5) (depuis C++11)
Défini dans l'en-tête <cmath>
template < class Integer >
int ilogb ( Integer num ) ;
(A) (depuis C++11)
(constexpr depuis C++23)
1-3) Extrait la valeur de l'exposant non biaisé de l'argument à virgule flottante num , et la retourne comme une valeur entière signée. La bibliothèque fournit des surcharges de std::ilogb pour tous les types à virgule flottante non qualifiés cv comme type du paramètre num . (depuis C++23)
4) S'étend en une expression constante entière dont la valeur est soit INT_MIN soit - INT_MAX .
5) Se développe en une expression constante entière dont la valeur est soit INT_MIN soit + INT_MAX .
A) Des surcharges supplémentaires sont fournies pour tous les types entiers, qui sont traités comme double .

Formellement, l'exposant non biaisé est la partie entière de log r |num| en tant que valeur entière signée, pour num non nul, où r est std:: numeric_limits < T > :: radix et T est le type à virgule flottante de num .

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 signée de type int.

Si num est nul, FP_ILOGB0 est renvoyé.

Si num est infini, INT_MAX est retourné.

Si num est un NaN, FP_ILOGBNAN est renvoyé.

Si le résultat correct est supérieur à INT_MAX ou inférieur à INT_MIN , la valeur de retour n'est pas spécifiée.

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 zéro, infini ou NaN.

Si le résultat correct est supérieur à INT_MAX ou inférieur à INT_MIN , une erreur de domaine ou une erreur de plage peut survenir.

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

Notes

Si num n'est pas zéro, infini ou NaN, la valeur retournée est exactement équivalente à static_cast < int > ( std:: logb ( num ) ) .

POSIX exige qu'une erreur de domaine se produise si num est zéro, infini, NaN, ou si le résultat correct est en dehors de la plage de int .

POSIX exige également que, sur les systèmes conformes XSI, la valeur retournée lorsque le résultat correct est supérieur à INT_MAX soit INT_MAX et la valeur retournée lorsque le résultat correct est inférieur à INT_MIN soit INT_MIN .

Le résultat correct peut être représenté comme int sur toutes les implémentations connues. Pour qu'un dépassement de capacité se produise, INT_MAX doit être inférieur à LDBL_MAX_EXP * std:: log2 ( FLT_RADIX ) ou INT_MIN doit être supérieur à LDBL_MIN_EXP - LDBL_MANT_DIG ) * std:: log2 ( FLT_RADIX ) .

La valeur de l'exposant retournée par std::ilogb 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::ilogb , |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 :: ilogb ( num ) ait le même effet que std :: ilogb ( 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 << "ilogb(0) = " << std::ilogb(0) << '\n';
    if (std::fetestexcept(FE_INVALID))
        std::cout << "    FE_INVALID 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
ilogb(0) = -2147483648
    FE_INVALID raised

Voir aussi

(C++11) (C++11)
décompose un nombre en significande 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)