Namespaces
Variants

Floating constant

From cppreference.net

Permet d'utiliser directement des valeurs de type flottant dans les expressions.

Table des matières

Syntaxe

Une constante flottante est une expression non-lvalue ayant la forme :

significand exponent  (facultatif) suffix  (facultatif)

Où le significand a la forme

nombre-entier  (optionnel) . (optionnel) fraction  (optionnel)

L' exposant a la forme

e | E signe-exposant  (optionnel) séquence-chiffres (1)
p | P signe-exposant  (optionnel) séquence-chiffres (2) (depuis C99)
1) La syntaxe d'exposant pour une constante décimale en virgule flottante
2) La syntaxe d'exposant pour la constante hexadécimale en virgule flottante

Des apostrophes simples facultatives ( ' ) peuvent être insérées entre les chiffres comme séparateur, elles sont ignorées lors de la compilation.

(depuis C23)

Explication

Si la significande commence par la séquence de caractères 0x ou 0X , la constante flottante est une constante flottante hexadécimale . Sinon, c'est une constante flottante décimale .

Pour une constante flottante hexadécimale , la significande 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 entière de 2 à laquelle la significande doit être mise à l'échelle.

double d = 0x1.2p3; // hex fraction 1.2 (decimal 1.125) scaled by 2^3, that is 9.0
(depuis C99)

Pour une constante flottante décimale , la significande est interprétée comme un nombre rationnel décimal, et la séquence-de-chiffres de l'exposant est interprétée comme la puissance entière de 10 à laquelle la significande doit être mise à l'échelle.

double d = 1.2e3; // fraction décimale 1.2 multipliée par 10^3, soit 1200.0

Suffixes

Une constante flottante non suffixée a le type double . Si le suffixe est la lettre f ou F , la constante flottante a le type float . Si le suffixe est la lettre l ou L , la constante flottante a le type long double .

Si l'implémentation prédéfinit la macro __STDC_IEC_60559_BFP__ , les suffixes suivants et les constantes flottantes correspondantes sont pris en charge en supplément :

  • si le suffixe est df ou DF , la constante flottante a le type _Decimal32 ;
  • si le suffixe est dd ou DD , la constante flottante a le type _Decimal64 ;
  • si le suffixe est dl ou DL , la constante flottante a le type _Decimal128 .

Les suffixes pour les types flottants décimaux ne sont pas autorisés dans les constantes flottantes hexadécimales.

(depuis C23)

Parties optionnelles

Si l'exposant est présent et que la partie fractionnaire n'est pas utilisée, le séparateur décimal peut être omis :

double x = 1e0; // virgule flottante 1.0 (point non utilisé)

Pour les constantes flottantes décimales, la partie exposant est facultative. Si elle est omise, le point n'est pas facultatif, et soit la partie entière soit la partie fractionnaire doit être présente.

double x = 1.; // nombre à virgule flottante 1.0 (partie fractionnaire facultative)
double y = .1; // nombre à virgule flottante 0.1 (partie entière facultative)

Pour les constantes flottantes hexadécimales, l'exposant n'est pas facultatif afin d'éviter l'ambiguïté résultant d'un suffixe f pouvant être confondu avec un chiffre hexadécimal.

(depuis C99)

Valeurs représentables

Le résultat de l'évaluation d'une constante flottante est soit la valeur représentable la plus proche, soit la valeur représentable immédiatement supérieure ou inférieure à la valeur représentable la plus proche, choisie de manière définie par l'implémentation (en d'autres termes, la direction d'arrondi par défaut pendant la traduction est définie par l'implémentation).

Toutes les constantes flottantes de la même forme source se convertissent au même format interne avec la même valeur. Les constantes flottantes de formes sources différentes, par exemple 1.23 et 1.230 , ne doivent pas nécessairement se convertir au même format interne et à la même valeur.

Les constantes flottantes peuvent être converties avec une plage et une précision supérieures à celles indiquées par leur type, si spécifié par FLT_EVAL_METHOD . Par exemple, la constante 0.1f peut se comporter comme si elle était 0.1L dans une expression.

Le résultat de l'évaluation d'une constante flottante hexadécimale, si FLT_RADIX vaut 2, est la valeur exacte représentée par la constante flottante, correctement arrondie au type cible.

(depuis C99)

Les constantes flottantes de type virgule flottante décimale qui ont la même valeur numérique x mais des exposants quantiques différents, par exemple 1230 . dd , 1230.0dd , et 1.23e3dd , ont des représentations internes distinctes.

L'exposant quantique q d'une constante flottante d'un type virgule flottante décimale est déterminé de manière que 10 q
représente 1 à la place du dernier chiffre du significand lorsque possible. Si l'exposant quantique q et le coefficient c=x·10 -q
déterminés ci-dessus ne peuvent pas être représentés exactement dans le type de la constante flottante, q est augmenté si nécessaire dans la limite du type, et c est réduit en conséquence, avec l'arrondi nécessaire. L'arrondi peut entraîner zéro ou l'infini. Si (le c éventuellement arrondi) est toujours hors de la plage autorisée après que q atteint la valeur maximale, la constante flottante résultante a pour valeur l'infini positif.

(depuis C23)

Notes

La direction d'arrondi par défaut et la précision sont en vigueur lorsque les constantes flottantes sont converties en représentations internes, et les exceptions en virgule flottante ne sont pas levées même si #pragma STDC FENV_ACCESS est en vigueur (pour la conversion à l'exécution des chaînes de caractères, strtod peut être utilisé). Notez que cela diffère des expressions constantes arithmétiques de type flottant.

Les lettres dans les constantes flottantes ne sont pas sensibles à la casse , sauf que les majuscules et minuscules ne peuvent pas être utilisées simultanément dans les suffixes pour les types flottants décimaux (depuis C23) : 0x1 . ep + 3 et 0X1 . EP + 3 représentent la même valeur flottante 15.0 .

Le point décimal spécifié par setlocale n'a aucun effet sur la syntaxe des constantes flottantes : le caractère de point décimal est toujours le point.

Contrairement aux entiers, toutes les valeurs flottantes ne peuvent pas être représentées directement par la syntaxe des constantes décimales ou même hexadécimales (depuis C99) : les macros NAN et INFINITY ainsi que les fonctions telles que nan offrent des moyens de générer ces valeurs spéciales (depuis C99) . Notez que 0x1 . FFFFFEp128f , qui pourrait sembler être un NaN float IEEE, déborde en réalité vers une infinité dans ce format.

Il n'existe pas de constantes flottantes négatives ; une expression telle que - 1.2 est l'application de l'opérateur arithmétique moins unaire à la constante flottante 1.2 . Notez que la valeur spéciale zéro négatif peut être construite avec - 0.0 .

Exemple

#include <stdio.h>
int main(void)
{
    printf("15.0     = %a\n", 15.0);
    printf("0x1.ep+3 = %f\n", 0x1.ep+3);
    // Constants outside the range of type double.
    printf("+2.0e+308 --> %g\n",  2.0e+308);
    printf("+1.0e-324 --> %g\n",  1.0e-324);
    printf("-1.0e-324 --> %g\n", -1.0e-324);
    printf("-2.0e+308 --> %g\n", -2.0e+308);
}

Sortie :

15.0     = 0x1.ep+3
0x1.ep+3 = 15.000000
+2.0e+308 --> inf
+1.0e-324 --> 0
-1.0e-324 --> -0
-2.0e+308 --> -inf

Références

  • Norme C23 (ISO/IEC 9899:2024) :
  • 6.4.4.2 Constantes flottantes (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 6.4.4.2 Constantes flottantes (p: 47-48)
  • Norme C11 (ISO/CEI 9899:2011):
  • 6.4.4.2 Constantes flottantes (p: 65-66)
  • Norme C99 (ISO/IEC 9899:1999) :
  • 6.4.4.2 Constantes flottantes (p: 57-58)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 3.1.3.1 Constantes flottantes

Voir aussi

Documentation C++ pour Littéral à virgule flottante