std::numeric_limits
| Definiert in Header <limits> |
||
| template< class T > class numeric_limits; |
||
Die Klasse std::numeric_limits bietet eine standardisierte Möglichkeit, verschiedene Eigenschaften von arithmetischen Typen abzufragen (z.B. ist der größtmögliche Wert für den Typ int std::numeric_limits<int>::max()).
Diese Information wird über Spezialisierungen der Template-Klasse std::numeric_limits bereitgestellt. Die Standardbibliothek stellt Spezialisierungen für alle arithmetischen Typen zur Verfügung (hier werden nur die Spezialisierungen für cv-unqualifizierte arithmetische Typen aufgeführt).
| Definiert in Header <limits> |
||
| template<> class numeric_limits<bool>; |
||
| template<> class numeric_limits<char>; |
||
| template<> class numeric_limits<signed char>; |
||
| template<> class numeric_limits<unsigned char>; |
||
| template<> class numeric_limits<wchar_t>; |
||
| template<> class numeric_limits<char8_t>; |
(seit C++20) | |
| template<> class numeric_limits<char16_t>; |
(seit C++11) | |
| template<> class numeric_limits<char32_t>; |
(seit C++11) | |
| template<> class numeric_limits<short>; |
||
| template<> class numeric_limits<unsigned short>; |
||
| template<> class numeric_limits<int>; |
||
| template<> class numeric_limits<unsigned int>; |
||
| template<> class numeric_limits<long>; |
||
| template<> class numeric_limits<unsigned long>; |
||
| template<> class numeric_limits<long long>; |
(seit C++11) | |
| template<> class numeric_limits<unsigned long long>; |
(seit C++11) | |
| template<> class numeric_limits<float>; |
||
| template<> class numeric_limits<double>; |
||
| template<> class numeric_limits<long double>; |
||
Der Wert jedes Elements einer Spezialisierung von std::numeric_limits für einen cv-qualifizierten Typ cv T ist gleich dem Wert des entsprechenden Elements der Spezialisierung für den unqualifizierten Typ T. Zum Beispiel ist std::numeric_limits<int>::digits gleich std::numeric_limits<const int>::digits.
Aliase von arithmetischen Typen (wie z.B. std::size_t oder std::streamsize) können ebenfalls mit den std::numeric_limits Typ-Traits untersucht werden.
Standardtypen, die keine arithmetischen Typen sind, wie z.B. std::complex<T> oder std::nullptr_t, haben keine Spezialisierungen.
|
Wenn die Implementierung Integer-ähnliche Typen definiert, müssen auch für diese Spezialisierungen von |
(seit C++20) |
Implementierungen können Spezialisierungen von std::numeric_limits für implementierungsspezifische Typen bereitstellen: z.B. stellt GCC std::numeric_limits<__int128> bereit. Nicht-Standardbibliotheken können Spezialisierungen hinzufügen für von der Bibliothek bereitgestellte Typen, z.B. stellt OpenEXR std::numeric_limits<half> für einen 16-Bit-Gleitkommatyp bereit.
Inhalt |
[bearbeiten] Template-Parameter
| T | - | ein Typ, für den numerische Eigenschaften abgefragt werden sollen |
[bearbeiten] Member-Konstanten
| [static] |
identifiziert Typen, für die std::numeric_limits spezialisiert ist(öffentliche statische Member-Konstante) |
| [static] |
identifiziert vorzeichenbehaftete Typen (öffentliche statische Member-Konstante) |
| [static] |
identifiziert Ganzzahltypen (öffentliche statische Member-Konstante) |
| [static] |
identifiziert exakte Typen (öffentliche statische Member-Konstante) |
| [static] |
identifiziert Gleitkommatypen, die den speziellen Wert "positive Unendlichkeit" darstellen können (öffentliche statische Member-Konstante) |
| [static] |
identifiziert Gleitkommatypen, die den speziellen Wert "quiet not-a-number" (NaN) darstellen können (öffentliche statische Member-Konstante) |
| [static] |
identifiziert Gleitkommatypen, die den speziellen Wert "signaling not-a-number" (NaN) darstellen können (öffentliche statische Member-Konstante) |
| [static] |
identifiziert den Denormalisierungsstil, der vom Gleitkommatyp verwendet wird (öffentliche statische Member-Konstante) |
| [static] |
identifiziert die Gleitkommatypen, die einen Präzisionsverlust als Denormalisierungsverlust und nicht als ungenaues Ergebnis erkennen (öffentliche statische Member-Konstante) |
| [static] |
identifiziert den Rundungsstil, der vom Typ verwendet wird (öffentliche statische Member-Konstante) |
| [static] |
identifiziert die IEC 559/IEEE 754 Gleitkommatypen (öffentliche statische Member-Konstante) |
| [static] |
identifiziert Typen, die eine endliche Menge von Werten darstellen (öffentliche statische Member-Konstante) |
| [static] |
identifiziert Typen, die Überläufe mit Modulo-Arithmetik behandeln (öffentliche statische Member-Konstante) |
| [static] |
Anzahl der radix-Ziffern, die ohne Änderung dargestellt werden können(öffentliche statische Member-Konstante) |
| [static] |
Anzahl der Dezimalziffern, die ohne Änderung dargestellt werden können (öffentliche statische Member-Konstante) |
| [statisch] (C++11) |
Anzahl der Dezimalziffern, die erforderlich sind, um alle Werte dieses Typs zu unterscheiden (öffentliche statische Member-Konstante) |
| [static] |
die Basis oder der ganzzahlige Basiswert, der für die Darstellung des gegebenen Typs verwendet wird (öffentliche statische Member-Konstante) |
| [static] |
eins mehr als die kleinste negative Potenz der Basis, die ein gültiger normalisierter Gleitkommawert ist (öffentliche statische Member-Konstante) |
| [static] |
die kleinste negative Potenz von zehn, die ein gültiger normalisierter Gleitkommawert ist (öffentliche statische Member-Konstante) |
| [static] |
eins mehr als die größte ganzzahlige Potenz der Basis, die ein gültiger endlicher Gleitkommawert ist (öffentliche statische Member-Konstante) |
| [static] |
die größte ganzzahlige Potenz von 10, die ein gültiger endlicher Gleitkommawert ist (öffentliche statische Member-Konstante) |
| [static] |
identifiziert Typen, die arithmetische Operationen zum Trappen bringen können (öffentliche statische Member-Konstante) |
| [static] |
identifiziert Gleitkommatypen, die "tinyness" vor dem Runden erkennen (öffentliche statische Member-Konstante) |
[bearbeiten] Member-Funktionen
| [static] |
gibt den kleinsten endlichen Wert des gegebenen nicht-Gleitkommatyps oder den kleinsten positiven normalen Wert des gegebenen Gleitkommatyps zurück (öffentliche statische Member-Funktion) |
| [statisch] (C++11) |
gibt den kleinsten endlichen Wert des gegebenen Typs zurück, d.h. den negativsten Wert für vorzeichenbehaftete Typen, 0 für vorzeichenlose Typen (öffentliche statische Member-Funktion) |
| [static] |
gibt den größten endlichen Wert des gegebenen Typs zurück (öffentliche statische Member-Funktion) |
| [static] |
gibt die Differenz zwischen 1.0 und dem nächstgrößeren darstellbaren Wert des gegebenen Gleitkommatyps zurück(öffentliche statische Member-Funktion) |
| [static] |
gibt den maximalen Rundungsfehler des gegebenen Gleitkommatyps zurück (öffentliche statische Member-Funktion) |
| [static] |
gibt den positiven Unendlichkeitswert des gegebenen Gleitkommatyps zurück (öffentliche statische Member-Funktion) |
| [static] |
gibt einen stillen NaN-Wert des gegebenen Gleitkommatyps zurück (öffentliche statische Member-Funktion) |
| [static] |
gibt einen Signal-NaN-Wert des gegebenen Gleitkommatyps zurück (öffentliche statische Member-Funktion) |
| [static] |
gibt den kleinsten positiven Subnormalwert des gegebenen Gleitkommatyps zurück (öffentliche statische Member-Funktion) |
[bearbeiten] Hilfsklassen
| zeigt Gleitkomma-Rundungsmodi an (enum) | |
| zeigt Gleitkomma-Denormalisierungsmodi an (enum) |
[bearbeiten] Beziehung zu C-Bibliotheksmakrokonstanten
Spezialisierungstd::numeric_limits<T>wobei T ist |
Member | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
min()
|
lowest()(C++11) |
max()
|
radix
| ||||||||
| bool | false | false | true | 2 | |||||||
| char | CHAR_MIN | CHAR_MIN | CHAR_MAX | 2 | |||||||
| signed char | SCHAR_MIN | SCHAR_MIN | SCHAR_MAX | 2 | |||||||
| unsigned char | 0 | 0 | UCHAR_MAX | 2 | |||||||
| wchar_t | WCHAR_MIN | WCHAR_MIN | WCHAR_MAX | 2 | |||||||
| char8_t | 0 | 0 | UCHAR_MAX | 2 | |||||||
| char16_t | 0 | 0 | UINT_LEAST16_MAX | 2 | |||||||
| char32_t | 0 | 0 | UINT_LEAST32_MAX | 2 | |||||||
| short | SHRT_MIN | SHRT_MIN | SHRT_MAX | 2 | |||||||
| signed short | |||||||||||
| unsigned short | 0 | 0 | USHRT_MAX | 2 | |||||||
| int | INT_MIN | INT_MIN | INT_MAX | 2 | |||||||
| signed int | |||||||||||
| unsigned int | 0 | 0 | UINT_MAX | 2 | |||||||
| long | LONG_MIN | LONG_MIN | LONG_MAX | 2 | |||||||
| signed long | |||||||||||
| unsigned long | 0 | 0 | ULONG_MAX | 2 | |||||||
| long long | LLONG_MIN | LLONG_MIN | LLONG_MAX | 2 | |||||||
| signed long long | |||||||||||
| unsigned long long | 0 | 0 | ULLONG_MAX | 2 | |||||||
Spezialisierungstd::numeric_limits<T>wobei T ist |
Member | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
denorm_min()
|
min()
|
lowest()(C++11) |
max()
|
epsilon()
|
digits
|
digits10
| |||||
| float | FLT_TRUE_MIN | FLT_MIN | -FLT_MAX | FLT_MAX | FLT_EPSILON | FLT_MANT_DIG | FLT_DIG | ||||
| double | DBL_TRUE_MIN | DBL_MIN | -DBL_MAX | DBL_MAX | DBL_EPSILON | DBL_MANT_DIG | DBL_DIG | ||||
| long double | LDBL_TRUE_MIN | LDBL_MIN | -LDBL_MAX | LDBL_MAX | LDBL_EPSILON | LDBL_MANT_DIG | LDBL_DIG | ||||
Spezialisierungstd::numeric_limits<T>wobei T ist |
Elemente (Fortsetzung) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
min_exponent
|
min_exponent10
|
max_exponent
|
max_exponent10
|
radix
| |||||||
| float | FLT_MIN_EXP | FLT_MIN_10_EXP | FLT_MAX_EXP | FLT_MAX_10_EXP | FLT_RADIX | ||||||
| double | DBL_MIN_EXP | DBL_MIN_10_EXP | DBL_MAX_EXP | DBL_MAX_10_EXP | FLT_RADIX | ||||||
| long double | LDBL_MIN_EXP | LDBL_MIN_10_EXP | LDBL_MAX_EXP | LDBL_MAX_10_EXP | FLT_RADIX | ||||||
[bearbeiten] Beispiel
#include <iostream> #include <limits> int main() { std::cout << "type\t│ lowest()\t│ min()\t\t│ max()\n" << "bool\t│ " << std::numeric_limits<bool>::lowest() << "\t\t│ " << std::numeric_limits<bool>::min() << "\t\t│ " << std::numeric_limits<bool>::max() << '\n' << "uchar\t│ " << +std::numeric_limits<unsigned char>::lowest() << "\t\t│ " << +std::numeric_limits<unsigned char>::min() << "\t\t│ " << +std::numeric_limits<unsigned char>::max() << '\n' << "int\t│ " << std::numeric_limits<int>::lowest() << "\t│ " << std::numeric_limits<int>::min() << "\t│ " << std::numeric_limits<int>::max() << '\n' << "float\t│ " << std::numeric_limits<float>::lowest() << "\t│ " << std::numeric_limits<float>::min() << "\t│ " << std::numeric_limits<float>::max() << '\n' << "double\t│ " << std::numeric_limits<double>::lowest() << "\t│ " << std::numeric_limits<double>::min() << "\t│ " << std::numeric_limits<double>::max() << '\n'; }
Mögliche Ausgabe
type │ lowest() │ min() │ max() bool │ 0 │ 0 │ 1 uchar │ 0 │ 0 │ 255 int │ -2147483648 │ -2147483648 │ 2147483647 float │ -3.40282e+38 │ 1.17549e-38 │ 3.40282e+38 double │ -1.79769e+308 │ 2.22507e-308 │ 1.79769e+308
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 201 | C++98 | Spezialisierungen für alle fundamentalen Typen müssen bereitgestellt werden | nicht-arithmetische Typen ausgeschlossen |
| LWG 559 | C++98 | es war unklar, ob die std::numeric_limitsSpezialisierung für einen cv-qualifizierten Typ genauso verhält wie die entsprechende Spezialisierung für den cv-unqualifizierten Typ |
sie haben das gleiche Verhalten |