Maximal- und Minimalwerte
Die in die Sprachen C und C++ eingebauten Basistypen weisen unterschiedliche Bitweiten auf und können dementsprechend einen mehr oder weniger grossen Zahlenbereich abdecken. Die im aktuell verwendeten Compiler verfügbaren Minimal- und Maximalwerte der Basistypen sind als Konstanten definiert, welche für Ganzzahltypen in der limits-Bibliothek und für Fliesskommatypen in der float-Bibliothek aufgelistet sind.
Ganzzahltypen
|
|
Mithilfe der in der limits-Bibliothek definierten Makros kann der Wertebereich des verwendeten Compilers für die Typen char, short, int und long long abgefragt werden. Folgendes Beispielprogramm soll zur Auflistung der Makros genügen:
|
|
Es ist zu beachten, dass keine Makros für den Minimalwert eines unsigned-Typs existieren. Dieser ist in jedem Fall 0 (Null).
Es ist desweiteren zu beachten, dass je nach System die ausgegebenen Werte durchaus unterschiedlich sein mögen, oder aber gewisse Makros gar nicht definiert sind. Die auf dieser Seite angegebenen Werte sind diejenigen, welche auf dem System des Autors ausgegeben wurden.
In der limits-Bibliothek befinden sich zudem noch ein paar weitere Makros, welche jedoch für die alltägliche Programmierung kaum relevant sind. Sie sind in der folgenden Tabelle zusammen mit den beim Autor definierten Werten aufgelistet, allerdings wird auf dieser Seite nicht weiter darauf eingegangen. Der Interessierte Leser möge die Bedeutungen in der limits-Bibliothek oder in anderen Quellen nachlesen.
CHAR_BIT | 8 | Anzahl Bits in einem char |
MB_LEN_MAX | 6 | Maximale Anzahl Bytes eines Multi-Byte-Zeichens |
CHAR_MIN | -128 | Minimaler Wert eines char ohne signed- oder unsigned-Angabe |
CHAR_MAX | 127 | Maximaler Wert eines char ohne signed- oder unsigned-Angabe |
LONG_MIN | -2147483648 | Minimaler Wert eines signed long |
LONG_MAX | 2147483647 | Maximaler Wert eines signed long |
ULONG_MAX | 4294967295 | Maximaler Wert eines unsigned long |
Des weiteren definieren gewisse Implementationen noch zusätzliche Makros, welche jedoch weniger neue Funktionalität einführen, denn einfach die bestehende mit neuen Symbolen zu belegen.
LONG_LONG_MIN | Dasselbe wie LLONG_MIN |
LONG_LONG_MAX | Dasselbe wie LLONG_MAX |
ULONG_LONG_MAX | Dasselbe wie ULLONG_MAX |
Fliesskommatypen
|
|
Für die drei Typen float, double und long double existieren jeweils Makros, welche den Minimal und Maximal darstellbaren Wert beschreiben. Hierbei handelt es sich jedoch beim Minimum nicht wie bei den Ganzzahlen um einen negativen Wert, sondern um den kleinsten Wert, der grösser ist als Null. Fliesskommazahlen besitzen stets ein Vorzeichen-Bit, womit die durch die Makros beschriebenen Werte somit auch für negative Werte verwendet werden können.
|
|
Auch hier ist zu beachten, dass je nach System die ausgegebenen Werte unterschiedlich sein können. Die auf dieser Seite angegebenen Werte sind diejenigen, welche auf dem System des Autors ausgegeben wurden.
In der float-Bibliothek befinden sich noch weitere Makros mit Konstanten zu Basis, Mantisse, Exponent, Maschinenepsilon sowie Anzahl signifikanter Ziffern aller drei Fliesskommatypen. Aufgrund der komplexen Thematik der Fliesskomma-Arithmetik werden auf dieser Seite diese Makros jedoch nur mit den beim Autor definierten Werten in der folgenden Tabelle aufgelistet, jedoch nicht weiter darauf eingegangen. Für weiterführende Informationen wird auf ein Studium der float-Bibliothek sowie andere Quellen verwiesen.
FLT_RADIX | 2 | Die Basis der Exponentialdarstellung |
FLT_ROUNDS | 1 | Rundungs-Methode |
FLT_EVAL_METHOD | 0 | Fliesskomma-Auswertungsmethode |
DECIMAL_DIG | 21 | Maximale Anzahl Rundungs-genaue Dezimal-Stellen |
FLT_MANT_DIG | 24 | Anzahl Radix-Ziffern der Mantisse für float |
DBL_MANT_DIG | 53 | Anzahl Radix-Ziffern der Mantisse für double |
LDBL_MANT_DIG | 64 | Anzahl Radix-Ziffern der Mantisse für long double |
FLT_DIG | 6 | Anzahl genauer Dezimalstellen für float |
DBL_DIG | 15 | Anzahl genauer Dezimalstellen für double |
LDBL_DIG | 18 | Anzahl genauer Dezimalstellen für long double |
FLT_MIN_EXP | -125 | Minimaler Radix-Exponent für normalisierten float |
DBL_MIN_EXP | -1021 | Minimaler Radix-Exponent für normalisierten double |
LDBL_MIN_EXP | -16381 | Minimaler Radix-Exponent für normalisierten long double |
FLT_MIN_10_EXP | -37 | Minimaler Dezimal-Exponent für normalisierten float |
DBL_MIN_10_EXP | -307 | Minimaler Dezimal-Exponent für normalisierten double |
LDBL_MIN_10_EXP | -4931 | Minimaler Dezimal-Exponent für normalisierten long double |
FLT_MAX_EXP | 128 | Maximaler Radix-Exponent für normalisierten float |
DBL_MAX_EXP | 1024 | Maximaler Radix-Exponent für normalisierten double |
LDBL_MAX_EXP | 16384 | Maximaler Radix-Exponent für normalisierten long double |
FLT_MAX_10_EXP | 38 | Maximaler Dezimal-Exponent für normalisierten float |
DBL_MAX_10_EXP | 308 | Maximaler Dezimal-Exponent für normalisierten double |
LDBL_MAX_10_EXP | 4932 | Maximaler Dezimal-Exponent für normalisierten long double |
FLT_EPSILON | 1.192093e-07 | Maschinen-Epsilon für float |
DBL_EPSILON | 2.220446e-16 | Maschinen-Epsilon für double |
LDBL_EPSILON | 1.084202e-19 | Maschinen-Epsilon für long double |