Namensräume
Varianten
Aktionen

Gleitkomma-Konstante

Von cppreference.com
< c‎ | Sprache

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)
1) Die Exponenten-Syntax für eine Dezimal-Gleitkomma-Konstante
2) Die Exponenten-Syntax für eine Hexadezimal-Gleitkomma-Konstante

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

(seit C23)

[bearbeiten] Erklärung

Wenn das Signifikant mit der Zeichensequenz 0x oder 0X beginnt, handelt es sich bei der Gleitkomma-Konstante um eine Hexadezimal-Gleitkomma-Konstante. Andernfalls handelt es sich um eine Dezimal-Gleitkomma-Konstante.

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

  • wenn das Suffix df oder DF ist, hat die Gleitkomma-Konstante den Typ _Decimal32;
  • wenn das Suffix dd oder DD ist, hat die Gleitkomma-Konstante den Typ _Decimal64;
  • wenn das Suffix dl oder DL ist, hat die Gleitkomma-Konstante den Typ _Decimal128.

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 f-Suffix als hexadezimale Ziffer missverstanden werden könnte.

(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
1 an der Stelle der letzten Ziffer des Signifikanten darstellt, wenn möglich. Wenn der Quantenexponent q und der Koeffizient c=x·10-q
, die oben bestimmt wurden, nicht exakt im Typ der Gleitkomma-Konstante dargestellt werden können, wird q innerhalb der Grenzen des Typs erhöht, und c wird 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 Gleitkomma-Konstante den Wert positive Unendlich.

(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