Namespaces
Variants

Floating constant

From cppreference.net

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)
1) Die Exponent-Syntax für eine dezimale Gleitkommakonstante
2) Die Exponent-Syntax für hexadezimale Gleitkommakonstanten

Optionale einfache Anführungszeichen ( ' ) können als Trennzeichen zwischen den Ziffern eingefügt werden; sie werden bei der Kompilierung ignoriert.

(seit C23)

Erklärung

Wenn die Significand mit der Zeichenfolge 0x oder 0X beginnt, ist die Gleitkommakonstante eine hexadezimale Gleitkommakonstante . Andernfalls handelt es sich um eine dezimale Gleitkommakonstante .

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 __STDC_IEC_60559_BFP__ vordefiniert, werden die folgenden Suffixe und entsprechenden Gleitkommakonstanten zusätzlich unterstützt:

  • wenn das Suffix df oder DF lautet, hat die Gleitkommakonstante den Typ _Decimal32 ;
  • wenn das Suffix dd oder DD lautet, hat die Gleitkommakonstante den Typ _Decimal64 ;
  • wenn das Suffix dl oder DL lautet, hat die Gleitkommakonstante den Typ _Decimal128 .

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 f Suffix fälschlicherweise als hexadezimale Ziffer interpretiert wird.

(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
1 an der Stelle der letzten Ziffer der Signifikande repräsentiert, wenn möglich. Wenn der Quantenexponent q und der Koeffizient c=x·10 -q
nicht exakt im Typ der Gleitkommakonstante dargestellt werden können, wird q innerhalb der Grenzen des Typs nach Bedarf erhöht und c entsprechend reduziert, mit erforderlicher Rundung. Die Rundung kann zu Null oder Unendlich führen. Wenn (der möglicherweise gerundete) c nach Erreichen des Maximalwerts von q immer noch außerhalb des zulässigen Bereichs liegt, hat die resultierende Gleitkommakonstante den Wert positive Unendlichkeit.

(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