Gleitkommazahl-Literal
Ein Gleitkommazahl-Literal definiert eine zur Kompilierzeit konstante Größe, deren Wert in der Quelldatei angegeben ist.
Inhalt |
[bearbeiten] Syntax
| Ziffernfolge DezimalExponent Suffix (optional) | (1) | ||||||||
Ziffernfolge . DezimalExponent (optional) Suffix (optional) |
(2) | ||||||||
Ziffernfolge (optional) . Ziffernfolge DezimalExponent (optional) Suffix (optional) |
(3) | ||||||||
0x | 0X HexZiffernfolge HexExponent Suffix (optional) |
(4) | (seit C++17) | |||||||
0x | 0X HexZiffernfolge . HexExponent Suffix (optional) |
(5) | (seit C++17) | |||||||
0x | 0X HexZiffernfolge (optional) . HexZiffernfolge HexExponent Suffix (optional) |
(6) | (seit C++17) | |||||||
DezimalExponent hat die Form
e | E ExponentVorzeichen (optional) Ziffernfolge |
|||||||||
HexExponent hat die Form
p | P ExponentVorzeichen (optional) Ziffernfolge |
(seit C++17) | ||||||||
ExponentVorzeichen, falls vorhanden, ist entweder + oder -
Suffix, falls vorhanden, ist eines von f, l, F, L, f16, f32, f64, f128, bf16, F16, F32, F64, F128, BF16(seit C++23). Das Suffix bestimmt den Typ des Gleitkommazahl-Literals
- (kein Suffix) definiert double
-
f Fdefiniert float -
l Ldefiniert long double
|
(seit C++23) |
|
Optionale einfache Anführungszeichen (') dürfen zwischen den Ziffern als Trennzeichen eingefügt werden; sie werden bei der Ermittlung des Werts des Literals ignoriert. |
(seit C++14) |
[bearbeiten] Erklärung
Es wird die Dezimalwissenschaftliche Notation verwendet, d.h. der Wert des Gleitkommazahl-Literals ist der Signifikand multipliziert mit der Zahl 10 hoch der Potenz von DezimalExponent. Z.B. bedeutet die mathematische Bedeutung von 123e4 *123×104*.
|
Wenn das Gleitkommazahl-Literal mit der Zeichensequenz Bei einem hexadezimalen Gleitkommazahl-Literal wird der Signifikand als eine hexadezimale rationale Zahl interpretiert, und die Ziffernfolge des Exponenten wird als die (dezimale) ganzzahlige Potenz von 2 interpretiert, mit der der Signifikand skaliert werden muss. double d = 0x1.4p3; |
(seit C++17) |
[bearbeiten] Hinweise
Hexadezimale Gleitkommazahl-Literale waren bis C++17 nicht Teil von C++, obwohl sie seit C++11 von I/O-Funktionen geparst und gedruckt werden können: sowohl C++ I/O-Streams, wenn std::hexfloat aktiviert ist, als auch C I/O-Streams: std::printf, std::scanf, etc. Siehe std::strtof für die Formatbeschreibung.
| Feature-Testmakro | Wert | Std | Feature |
|---|---|---|---|
__cpp_hex_float |
201603L |
(C++17) | Hexadezimale Gleitkommazahlen-Literale |
[bearbeiten] Beispiel
#include <iomanip> #include <iostream> #include <limits> #include <typeinfo> #define OUT(x) '\n' << std::setw(16) << #x << x int main() { std::cout << "Literal" "\t" "Printed value" << std::left << OUT( 58. ) // double << OUT( 4e2 ) // double << OUT( 123.456e-67 ) // double << OUT( 123.456e-67f ) // float, truncated to zero << OUT( .1E4f ) // float << OUT( 0x10.1p0 ) // double << OUT( 0x1p5 ) // double << OUT( 0x1e5 ) // integer literal, not floating-point << OUT( 3.14'15'92 ) // double, single quotes ignored (C++14) << OUT( 1.18e-4932l ) // long double << std::setprecision(39) << OUT( 3.4028234e38f ) // float << OUT( 3.4028234e38 ) // double << OUT( 3.4028234e38l ) // long double << '\n'; static_assert(3.4028234e38f == std::numeric_limits<float>::max()); static_assert(3.4028234e38f == // ends with 4 3.4028235e38f); // ends with 5 static_assert(3.4028234e38 != // ends with 4 3.4028235e38); // ends with 5 // Both floating-point constants below are 3.4028234e38 static_assert(3.4028234e38f != // a float (then promoted to double) 3.4028234e38); // a double }
Mögliche Ausgabe
Literal Printed value 58. 58 4e2 400 123.456e-67 1.23456e-65 123.456e-67f 0 .1E4f 1000 0x10.1p0 16.0625 0x1p5 32 0x1e5 485 3.14'15'92 3.14159 1.18e-4932l 1.18e-4932 3.4028234e38f 340282346638528859811704183484516925440 3.4028234e38 340282339999999992395853996843190976512 3.4028234e38l 340282339999999999995912555211526242304
[bearbeiten] Referenzen
- C++23 Standard (ISO/IEC 14882:2024)
- 5.13.4 Floating-point literals [lex.fcon]
- C++20 Standard (ISO/IEC 14882:2020)
- 5.13.4 Floating-point literals [lex.fcon]
- C++17 Standard (ISO/IEC 14882:2017)
- 5.13.4 Gleitkommazahl-Literale [lex.fcon]
- C++14 Standard (ISO/IEC 14882:2014)
- 2.14.4 Gleitkommazahl-Literale [lex.fcon]
- C++11 Standard (ISO/IEC 14882:2011)
- 2.14.4 Gleitkommazahl-Literale [lex.fcon]
- C++98 Standard (ISO/IEC 14882:1998)
- 2.13.3 Gleitkommazahl-Literale [lex.fcon]
[bearbeiten] Siehe auch
| benutzerdefinierte Literale(C++11) | Literale mit benutzerdefiniertem Suffix |
| C-Dokumentation für Gleitkommakonstante
| |