Floating constant
Ermöglicht die direkte Verwendung von Werten des Gleitkommatyps in Ausdrücken.
Inhaltsverzeichnis |
Syntax
Ein Gleitkommakonstante ist ein Nicht-Lvalue Ausdruck mit folgender Form:
| significand exponent (optional) suffix (optional) | |||||||||
Wo die Signifikand die Form hat
Ganzzahl
(optional)
.
(optional)
Bruchteil
(optional)
|
|||||||||
Der Exponent hat die Form
e
|
E
Exponentenzeichen
(optional)
Ziffernfolge
|
(1) | ||||||||
p
|
P
Exponentenzeichen
(optional)
Ziffernfolge
|
(2) | (seit C99) | |||||||
|
Optionale einfache Anführungszeichen (
|
(seit C23) |
Erklärung
|
Wenn die
Significand
mit der Zeichenfolge
Für eine hexadezimale Gleitkommakonstante wird die Significand als hexadezimale rationale Zahl interpretiert, und die Ziffernfolge des Exponenten wird als ganzzahlige Potenz von 2 interpretiert, mit der die Significand skaliert werden muss. double d = 0x1.2p3; // hex fraction 1.2 (decimal 1.125) scaled by 2^3, that is 9.0 |
(since C99) |
Für eine Dezimal-Gleitkommakonstante wird die Signifikande als dezimale rationale Zahl interpretiert, und die Ziffernfolge des Exponenten wird als ganzzahlige Potenz von 10 interpretiert, mit der die Signifikande skaliert werden muss.
double d = 1.2e3; // Dezimalbruch 1.2 skaliert mit 10^3, also 1200.0
Suffixe
Eine Gleitkommakonstante ohne Suffix hat den Typ
double
. Wenn das
Suffix
der Buchstabe
f
oder
F
ist, hat die Gleitkommakonstante den Typ
float
. Wenn das
Suffix
der Buchstabe
l
oder
L
ist, hat die Gleitkommakonstante den Typ
long
double
.
|
Falls die Implementierung das Makro
Suffixe für dezimale Gleitkommatypen sind in hexadezimalen Gleitkommakonstanten nicht zulässig. |
(seit C23) |
Optionale Teile
Wenn der Exponent vorhanden ist und der Bruchteil nicht verwendet wird, kann das Dezimaltrennzeichen weggelassen werden:
double x = 1e0; // Gleitkomma 1.0 (Punkt nicht verwendet)
Für dezimale Gleitkommakonstanten ist der exponent -Teil optional. Wenn er weggelassen wird, ist der Punkt nicht optional, und entweder der whole-number - oder der fraction -Teil muss vorhanden sein.
double x = 1.; // Gleitkommazahl 1.0 (Nachkommateil optional) double y = .1; // Gleitkommazahl 0.1 (Ganzzahlanteil optional)
|
Bei hexadezimalen Gleitkommakonstanten ist der Exponent nicht optional, um Mehrdeutigkeiten zu vermeiden, die dadurch entstehen könnten, dass ein
|
(since C99) |
Darstellbare Werte
Das Ergebnis der Auswertung einer Fließkommakonstante ist entweder der nächstgelegene darstellbare Wert oder der größere oder kleinere darstellbare Wert unmittelbar benachbart zum nächstgelegenen darstellbaren Wert, ausgewählt in einer implementierungsdefinierten Weise (mit anderen Worten, Standard-Rundungsrichtung während der Übersetzung ist implementierungsdefiniert).
Alle Gleitkommakonstanten derselben Quellform konvertieren in dasselbe interne Format mit demselben Wert. Gleitkommakonstanten verschiedener Quellformen, z.B. 1.23 und 1.230 , müssen nicht in dasselbe interne Format und denselben Wert konvertieren.
|
Fließkommakonstanten können in mehr Bereich und Genauigkeit konvertiert werden, als durch ihren Typ angegeben, falls durch FLT_EVAL_METHOD angegeben. Zum Beispiel kann die Konstante 0.1f sich in einem Ausdruck so verhalten, als wäre sie 0.1L . Das Ergebnis der Auswertung einer hexadezimalen Fließkommakonstante, wenn FLT_RADIX 2 ist, ist der exakte durch die Fließkommakonstante repräsentierte Wert, korrekt auf den Zieltyp gerundet. |
(since C99) |
|
Dezimale Gleitkommakonstanten, 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 Gleitkommakonstante eines dezimalen Gleitkommatyps wird so bestimmt, dass
10
q
|
(seit C23) |
Hinweise
Standardmäßig sind die Rundungsrichtung und Präzision wirksam, wenn die Gleitkommakonstanten in interne Darstellungen umgewandelt werden, und Gleitkomma-Ausnahmen werden nicht ausgelöst, selbst wenn #pragma STDC FENV_ACCESS aktiv ist (für die Laufzeit-Konvertierung von Zeichenketten kann strtod verwendet werden). Beachten Sie, dass dies sich von arithmetischen Konstantenausdrücken des Gleitkommatyps unterscheidet.
Die Buchstaben in den Gleitkommakonstanten sind unabhängig von Groß-/Kleinschreibung , außer dass Groß- und Kleinbuchstaben nicht gleichzeitig in Suffixen für dezimale Gleitkommatypen verwendet werden können (seit C23) : 0x1 . ep + 3 und 0X1 . EP + 3 repräsentieren denselben Gleitkommawert 15.0 .
Der durch setlocale festgelegte Dezimaltrennpunkt hat keine Auswirkung auf die Syntax von Gleitkommakonstanten: Das Dezimaltrennzeichen ist immer der Punkt.
Im Gegensatz zu Ganzzahlen kann nicht jeder Gleitkommawert direkt durch die Dezimal- oder sogar Hexadezimal (since C99) Konstantensyntax dargestellt werden : Makros wie NAN und INFINITY sowie Funktionen wie nan bieten Möglichkeiten, diese speziellen Werte zu erzeugen (since C99) . Beachten Sie, dass 0x1 . FFFFFEp128f , was wie ein IEEE float NaN erscheinen könnte, in diesem Format tatsächlich zu einer Unendlichkeit überläuft.
Es gibt keine negativen Fließkommakonstanten; ein Ausdruck wie - 1.2 ist der arithmetische Operator unäres Minus, angewendet auf die Fließkommakonstante 1.2 . Beachten Sie, dass der spezielle Wert negative Null mit - 0.0 konstruiert werden kann.
Beispiel
#include <stdio.h> int main(void) { printf("15.0 = %a\n", 15.0); printf("0x1.ep+3 = %f\n", 0x1.ep+3); // Konstanten außerhalb des Bereichs des Typs 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
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 6.4.4.2 Fließkommakonstanten (S.: TBD)
- C17-Standard (ISO/IEC 9899:2018):
-
- 6.4.4.2 Fließkommakonstanten (S: 47-48)
- C11-Standard (ISO/IEC 9899:2011):
-
- 6.4.4.2 Fließkommakonstanten (S: 65-66)
- C99-Standard (ISO/IEC 9899:1999):
-
- 6.4.4.2 Fließkommakonstanten (S: 57-58)
- C89/C90-Standard (ISO/IEC 9899:1990):
-
- 3.1.3.1 Gleitkommakonstanten
Siehe auch
|
C++ Dokumentation
für
Floating-point literal
|