Floating-point literal
Le littéral à virgule flottante définit une constante à la compilation dont la valeur est spécifiée dans le fichier source.
Table des matières |
Syntaxe
| digit-sequence decimal-exponent suffix (optionnel) | (1) | ||||||||
digit-sequence
.
decimal-exponent
(optionnel)
suffix
(optionnel)
|
(2) | ||||||||
digit-sequence
(optionnel)
.
digit-sequence
decimal-exponent
(optionnel)
suffix
(optionnel)
|
(3) | ||||||||
0x
|
0X
hex-digit-sequence
hex-exponent
suffix
(optionnel)
|
(4) | (depuis C++17) | |||||||
0x
|
0X
hex-digit-sequence
.
hex-exponent
suffix
(optionnel)
|
(5) | (depuis C++17) | |||||||
0x
|
0X
hex-digit-sequence
(optionnel)
.
hex-digit-sequence
hex-exponent
suffix
(optionnel)
|
(6) | (depuis C++17) | |||||||
decimal-exponent a la forme
e
|
E
signe-exposant
(optionnel)
séquence-de-chiffres
|
|||||||||
hex-exponent a la forme
p
|
P
signe-exposant
(optionnel)
séquence-de-chiffres
|
(depuis C++17) | ||||||||
exponent-sign
, s'il est présent, est soit
+
soit
-
suffix
, s'il est présent, est l'un des
f
,
l
,
F
,
L
,
f16
,
f32
,
f64
,
f128
,
bf16
,
F16
,
F32
,
F64
,
F128
,
BF16
(depuis C++23)
. Le suffixe détermine le type du littéral à virgule flottante :
-
- (sans suffixe) définit double
-
f Fdéfinit float -
l Ldéfinit long double
|
(depuis C++23) |
|
Des apostrophes simples facultatives ( ' ) peuvent être insérées entre les chiffres comme séparateur ; elles sont ignorées lors de la détermination de la valeur du littéral. |
(since C++14) |
Explication
La notation scientifique décimale est utilisée, ce qui signifie que la valeur du littéral à virgule flottante est la mantisse multipliée par le nombre 10 élevé à la puissance decimal-exponent . Par exemple, la signification mathématique de 123e4 est 123×10 4 .
|
Si le littéral flottant commence par la séquence de caractères
Pour un littéral flottant hexadécimal , la mantisse est interprétée comme un nombre rationnel hexadécimal, et la séquence-de-chiffres de l'exposant est interprétée comme la puissance (décimale) entière de 2 par laquelle la mantisse doit être mise à l'échelle.
double
d
=
0x1.4p3
;
|
(depuis C++17) |
Notes
Les littéraux à virgule flottante hexadécimaux ne faisaient pas partie de C++ avant C++17, bien qu'ils puissent être analysés et imprimés par les fonctions d'E/S depuis C++11 : à la fois les flux d'E/S C++ lorsque std::hexfloat est activé et les flux d'E/S C : std::printf , std::scanf , etc. Voir std::strtof pour la description du format.
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_hex_float
|
201603L
|
(C++17) | Littéraux flottants hexadécimaux |
Exemple
#include <iomanip> #include <iostream> #include <limits> #include <typeinfo> #define OUT(x) '\n' << std::setw(16) << #x << x int main() { std::cout << "Literal" "\t" "Printed value" << std::left << OUT( 58. ) // double << OUT( 4e2 ) // double << OUT( 123.456e-67 ) // double << OUT( 123.456e-67f ) // float, tronqué à zéro << OUT( .1E4f ) // float << OUT( 0x10.1p0 ) // double << OUT( 0x1p5 ) // double << OUT( 0x1e5 ) // littéral entier, non flottant << OUT( 3.14'15'92 ) // double, guillemets simples ignorés (C++14) << OUT( 1.18e-4932l ) // long double << std::setprecision(39) << OUT( 3.4028234e38f ) // float << OUT( 3.4028234e38 ) // double << OUT( 3.4028234e38l ) // long double << '\n'; static_assert(3.4028234e38f == std::numeric_limits<float>::max()); static_assert(3.4028234e38f == // se termine par 4 3.4028235e38f); // se termine par 5 static_assert(3.4028234e38 != // se termine par 4 3.4028235e38); // se termine par 5 // Les deux constantes flottantes ci-dessous valent 3.4028234e38 static_assert(3.4028234e38f != // un float (ensuite promu en double) 3.4028234e38); // un double }
Sortie possible :
Literal Printed value 58. 58 4e2 400 123.456e-67 1.23456e-65 123.456e-67f 0 .1E4f 1000 0x10.1p0 16.0625 0x1p5 32 0x1e5 485 3.14'15'92 3.14159 1.18e-4932l 1.18e-4932 3.4028234e38f 340282346638528859811704183484516925440 3.4028234e38 340282339999999992395853996843190976512 3.4028234e38l 340282339999999999995912555211526242304
Références
- Norme C++23 (ISO/CEI 14882:2024) :
-
- 5.13.4 Littéraux à virgule flottante [lex.fcon]
- Norme C++20 (ISO/CEI 14882:2020) :
-
- 5.13.4 Littéraux à virgule flottante [lex.fcon]
- Norme C++17 (ISO/CEI 14882:2017) :
-
- 5.13.4 Littéraux flottants [lex.fcon]
- Norme C++14 (ISO/CEI 14882:2014) :
-
- 2.14.4 Littéraux flottants [lex.fcon]
- Norme C++11 (ISO/CEI 14882:2011) :
-
- 2.14.4 Littéraux flottants [lex.fcon]
- Norme C++98 (ISO/CEI 14882:1998) :
-
- 2.13.3 Littéraux flottants [lex.fcon]
Voir aussi
| littéraux définis par l'utilisateur (C++11) | littéraux avec suffixe défini par l'utilisateur |
|
Documentation C
pour
Constante flottante
|
|