Namespaces
Variants

Floating-point literal

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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)
1) digit-sequence représentant un nombre entier sans séparateur décimal, dans ce cas l'exposant n'est pas facultatif : 1e10 , 1e - 5L .
2) digit-sequence représentant un nombre entier avec un séparateur décimal, dans ce cas l'exposant est facultatif : 1 . , 1. e -2 .
3) séquence de chiffres représentant un nombre fractionnaire. L'exposant est facultatif : 3.14 , .1f , 0.1e - 1L .
4) Séquences de chiffres hexadécimaux représentant un nombre entier sans séparateur de base. L'exposant n'est jamais optionnel pour les littéraux flottants hexadécimaux : 0x1ffp10 , 0X0p - 1 .
5) Chiffre hexadécimal digit-sequence représentant un nombre entier avec un séparateur de base. L'exposant n'est jamais optionnel pour les littéraux flottants hexadécimaux : 0x1 . p0 , 0xf . p - 1 .
6) Chiffre hexadécimal représentant un nombre fractionnaire avec un séparateur de base. L'exposant n'est jamais optionnel pour les littéraux à virgule flottante hexadécimaux : 0x0.123p - 1 , 0xa . bp10l .

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 F définit float
  • l L définit long double
  • f16 F16 définit std::float16_t
  • f32 F32 définit std::float32_t
  • f64 F64 définit std::float64_t
  • f128 F128 définit std::float128_t
  • bf16 BF16 définit std::bfloat16_t
(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 0x ou 0X , le littéral flottant est un littéral flottant hexadécimal . Sinon, c'est un littéral flottant décimal .

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 ; // fraction hexadécimale 1.4 (décimale 1.25) mise à l'échelle par 2 3 , c'est-à-dire 10.0

(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