Namensräume
Varianten
Aktionen

Gleitkommazahl-Literal

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolescher - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

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)
1) Ziffernfolge, die eine ganze Zahl ohne Dezimaltrennzeichen darstellt, in diesem Fall ist der Exponent nicht optional: 1e10, 1e-5L.
2) Ziffernfolge, die eine ganze Zahl mit einem Dezimaltrennzeichen darstellt, in diesem Fall ist der Exponent optional: 1., 1.e-2.
3) Ziffernfolge, die eine gebrochene Zahl darstellt. Der Exponent ist optional: 3.14, .1f, 0.1e-1L.
4) Hexadezimale Ziffernfolge, die eine ganze Zahl ohne Radix-Trennzeichen darstellt. Der Exponent ist für hexadezimale Gleitkommazahl-Literale niemals optional: 0x1ffp10, 0X0p-1.
5) Hexadezimale Ziffernfolge, die eine ganze Zahl mit einem Radix-Trennzeichen darstellt. Der Exponent ist für hexadezimale Gleitkommazahl-Literale niemals optional: 0x1.p0, 0xf.p-1.
6) Hexadezimale Ziffernfolge, die eine gebrochene Zahl mit einem Radix-Trennzeichen darstellt. Der Exponent ist für hexadezimale Gleitkommazahl-Literale niemals optional: 0x0.123p-1, 0xa.bp10l.

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 F definiert float
  • l L definiert long double
  • f16 F16 definiert std::float16_t
  • f32 F32 definiert std::float32_t
  • f64 F64 definiert std::float64_t
  • f128 F128 definiert std::float128_t
  • bf16 BF16 definiert std::bfloat16_t
(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 0x oder 0X beginnt, ist das Gleitkommazahl-Literal ein hexadezimales Gleitkommazahl-Literal. Andernfalls ist es ein dezimales Gleitkommazahl-Literal.

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;// hexadezimale Bruchteil 1.4 (dezimal 1.25) skaliert mit 23, das heißt 10.0

(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[bearbeiten]
C-Dokumentation für Gleitkommakonstante