std:: ilogb, std:: ilogbf, std:: ilogbl
|
Défini dans l'en-tête
<cmath>
|
||
| (1) | ||
|
int
ilogb
(
float
num
)
;
int
ilogb
(
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) |
std::ilogb
pour tous les types à virgule flottante non qualifiés cv comme type du paramètre
num
.
(depuis C++23)
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),
- Si le résultat correct est supérieur à INT_MAX ou inférieur à INT_MIN , FE_INVALID est déclenché.
- Si num est ±0, ±∞, ou NaN, FE_INVALID est déclenché.
- 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
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) |
|
Documentation C
pour
ilogb
|
|