Floating constant
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) | |||||||
|
Des apostrophes simples facultatives (
|
(depuis C23) |
Explication
|
Si la
significande
commence par la séquence de caractères
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
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
|
(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
|
(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
|