Gleitkomma-Konstante
Ermöglicht die direkte Verwendung von Werten vom Gleitkomma-Typ in Ausdrücken.
Inhalt |
[bearbeiten] Syntax
Eine Gleitkomma-Konstante ist ein Nicht-L-Wert-Ausdruck, der die Form hat
| Signifikant Exponent (optional) Suffix (optional) | |||||||||
Dabei hat das Signifikant die Form
Ganzzahlteil (optional) .(optional) Nachkommateil (optional) |
|||||||||
Der Exponent hat die Form
e | E Exponenten-Vorzeichen (optional) Ziffernfolge |
(1) | ||||||||
p | P Exponenten-Vorzeichen (optional) Ziffernfolge |
(2) | (seit C99) | |||||||
|
Optionale einfache Anführungszeichen ( |
(seit C23) |
[bearbeiten] Erklärung
|
Wenn das Signifikant mit der Zeichensequenz Bei einer Hexadezimal-Gleitkomma-Konstante wird das Signifikant als eine hexadezimale rationale Zahl interpretiert, und die Ziffernfolge des Exponenten wird als ganzzahliger Potenz von 2 interpretiert, mit der das Signifikant skaliert werden muss. double d = 0x1.2p3; // hex fraction 1.2 (decimal 1.125) scaled by 2^3, that is 9.0 |
(seit C99) |
Bei einer Dezimal-Gleitkomma-Konstante wird das Signifikant als eine dezimale rationale Zahl interpretiert, und die Ziffernfolge des Exponenten wird als ganzzahliger Potenz von 10 interpretiert, mit der das Signifikant skaliert werden muss.
double d = 1.2e3; // decimal fraction 1.2 scaled by 10^3, that is 1200.0
[bearbeiten] Suffixe
Eine Gleitkomma-Konstante ohne Suffix hat den Typ double. Wenn das Suffix der Buchstabe f oder F ist, hat die Gleitkomma-Konstante den Typ float. Wenn das Suffix der Buchstabe l oder L ist, hat die Gleitkomma-Konstante den Typ long double.
|
Wenn die Implementierung das Makro
Suffixe für Dezimal-Gleitkomma-Typen sind in Hexadezimal-Gleitkomma-Konstanten nicht erlaubt. |
(seit C23) |
[bearbeiten] Optionale Teile
Wenn der Exponent vorhanden ist und kein Nachkommateil verwendet wird, kann der Dezimaltrenner weggelassen werden
double x = 1e0; // floating-point 1.0 (period not used)
Für Dezimal-Gleitkomma-Konstanten ist der Exponententeil optional. Wenn er weggelassen wird, ist der Punkt nicht optional, und entweder der Ganzzahlteil oder der Nachkommateil muss vorhanden sein.
double x = 1.; // floating-point 1.0 (fractional part optional) double y = .1; // floating-point 0.1 (whole-number part optional)
|
Für Hexadezimal-Gleitkomma-Konstanten ist der Exponent nicht optional, um Mehrdeutigkeiten zu vermeiden, die dadurch entstehen, dass ein |
(seit C99) |
[bearbeiten] Darstellbare Werte
Das Ergebnis der Auswertung einer Gleitkomma-Konstanten ist entweder der nächstgelegene darstellbare Wert oder der nächstgrößere oder nächstkleinere darstellbare Wert, der an den nächstgelegenen darstellbaren Wert angrenzt, wobei die Auswahl auf implementierungsdefinierte Weise erfolgt (mit anderen Worten, die Standard-Rundungsrichtung während der Übersetzung ist implementierungsdefiniert).
Alle Gleitkomma-Konstanten mit derselben Quellform werden in dasselbe interne Format mit demselben Wert konvertiert. Gleitkomma-Konstanten mit unterschiedlichen Quellformen, z. B. 1.23 und 1.230, müssen nicht in dasselbe interne Format und denselben Wert konvertiert werden.
|
Gleitkomma-Konstanten können mehr Bereiche und Präzision aufweisen, als ihr Typ angibt, wenn dies durch FLT_EVAL_METHOD angegeben wird. Beispielsweise kann die Konstante 0.1f in einem Ausdruck so wirken, als wäre sie 0.1L. Das Ergebnis der Auswertung einer Hexadezimal-Gleitkomma-Konstante, wenn FLT_RADIX 2 ist, ist der exakte Wert, der durch die Gleitkomma-Konstante dargestellt wird, korrekt gerundet auf den Zieltyp. |
(seit C99) |
|
Gleitkomma-Konstanten vom Dezimal-Gleitkomma-Typ, die denselben numerischen Wert x, aber unterschiedliche Quantenexponenten haben, z. B. 1230.dd, 1230.0dd und 1.23e3dd, haben unterscheidbare interne Darstellungen. Der Quantenexponent q einer Gleitkomma-Konstante eines Dezimal-Gleitkomma-Typs wird so bestimmt, dass 10q |
(seit C23) |
[bearbeiten] Anmerkungen
Die Standard-Rundungsrichtung und Präzision gelten, wenn die Gleitkomma-Konstanten in interne Darstellungen konvertiert werden, und Gleitkomma-Ausnahmen werden nicht ausgelöst, auch wenn #pragma STDC FENV_ACCESS aktiv ist (für zur Laufzeit erfolgende Konvertierung von Zeichenketten kann strtod verwendet werden). Beachten Sie, dass dies von Arithmetischen Konstanten-Ausdrücken vom Gleitkomma-Typ abweicht.
Buchstaben in den Gleitkomma-Konstanten sind nicht beachtet die Groß-/Kleinschreibung, außer dass Groß- und Kleinbuchstaben nicht beide in Suffixen für Dezimal-Gleitkomma-Typen verwendet werden können(seit C23): 0x1.ep+3 und 0X1.EP+3 stellen denselben Gleitkommawert 15.0 dar.
Das durch setlocale definierte Dezimaltrennzeichen hat keinen Einfluss auf die Syntax von Gleitkomma-Konstanten: Das Dezimaltrennzeichen ist immer der Punkt.
Im Gegensatz zu ganzen Zahlen kann nicht jeder Gleitkommawert direkt durch die Syntax einer Dezimaloder sogar einer Hexadezimal(seit C99)-Konstante dargestellt werden: Makros NAN und INFINITY sowie Funktionen wie nan bieten Möglichkeiten, diese speziellen Werte zu generieren(seit C99). Beachten Sie, dass 0x1.FFFFFEp128f, was wie ein IEEE-Float NaN aussehen könnte, tatsächlich zu einer Unendlichkeitsdarstellung in diesem Format überläuft.
Es gibt keine negativen Gleitkomma-Konstanten; ein Ausdruck wie -1.2 ist der arithmetische Operator der unären Negation, angewendet auf die Gleitkomma-Konstante 1.2. Beachten Sie, dass der spezielle Wert negative Null mit -0.0 konstruiert werden kann.
[bearbeiten] Beispiel
#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); }
Ausgabe
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
[bearbeiten] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 6.4.4.2 Floating constants (p: TBD)
- C17-Standard (ISO/IEC 9899:2018)
- 6.4.4.2 Floating constants (p: 47-48)
- C11-Standard (ISO/IEC 9899:2011)
- 6.4.4.2 Floating constants (p: 65-66)
- C99-Standard (ISO/IEC 9899:1999)
- 6.4.4.2 Floating constants (p: 57-58)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 3.1.3.1 Floating constants
[bearbeiten] Siehe auch
| C++-Dokumentation für Gleitkomma-Literal
|