long double Typ

Der Typ long double speichert eine Realzahl, welche als Fliesskommazahl mit heutzutage üblicherweise 80, 96 oder 128 Bits codiert wird. Ein long double kann den Wertebereich von 3.362103e-4932 bis 1.189731e+4932 auf 18 Nachkommastellen genau abbilden, sowohl positiv, als auch negativ.

Details

Je nach System, Prozessor oder Compiler benötigt der Typ long double 10, 12 oder 16 Bytes zum Speichern des Wertes. Jedoch verwenden die meisten Implementationen nur 80 Bits für die Codierung der Fliesskommazahl. Je nach System oder Prozessor kann dieser Typ anders definiert sein. Es handelt sich hierbei um einen sogenannt erweiterten Fliesskomma-Typ gemäss der IEEE 754 Norm.

Der Typ long double gehorcht teilweise seltsamen Gesetzen, welche vorwiegend von den Prozessor-Designern festgelegt wurden. Auf dieser Seite wird deswegen auf eine detailierte Behandlung verzichtet. Wer sich jedoch für die auf seiner Maschine gültige Definition interessiert, findet in der floats-Bibliothek einige Makros, welche den Wertebereich von Fliesskommatypen genauer spezifizieren. Folgendes Programm liefert die Werte für den Typ long double auf dem System des Autors:





3.362103e-4932
1.189731e+4932
64
18
-16381
-4931
16384
4932
1.084202e-19
#include <stdio.h>
#include <float.h>

int main(){
  printf("%Le\n", LDBL_MIN);         // smallest value
  printf("%Le\n", LDBL_MAX);         // biggest value
  printf("%i\n",  LDBL_MANT_DIG);    // radix digits of mantissa
  printf("%i\n",  LDBL_DIG);         // accurate decimal digits
  printf("%i\n",  LDBL_MIN_EXP);     // minimal radix exponent
  printf("%i\n",  LDBL_MIN_10_EXP);  // minimal decimal exponent
  printf("%i\n",  LDBL_MAX_EXP);     // maximal radix exponent
  printf("%i\n",  LDBL_MAX_10_EXP);  // maximal decimal exponent
  printf("%Le\n", LDBL_EPSILON);     // machine epsilon
  return 0;
}

Es ist zu beachten, dass die Mantisse-Zahl in der floats-Bibliothek normalerweise ein implizites Bit hinzuzählt. Für genauere Informationen, was es mit diesem Bit auf sich hat, wird auf die Fliesskommacodierung verwiesen.

Bei der Angabe von festen Werten im Quellcode können long double-Werten ein kleines l (ell) oder ein grosses L als Suffix angehängt werden. Beide Suffixe bedeuten dasselbe, aufgrund der visuellen Ähnlichkeit des kleinen l (ell) zur Ziffer 1 (Eins) ist jedoch die Empfehlung des Autors, stets die Grossbuchstaben-Version zu verwenden. Ohne Suffix nimmt der Compiler an, dass es sich um einen double-Wert handelt.

float
double
long double
1.234f
1.234
1.234L

Arithmetische Umwandlung

Bei Zuweisungen, Initialisierungen oder Casts zu einem long double-Typ werden durch den Compiler gegebenfalls arithmetische Umwandlungen durchgeführt.

Der long double-Typ ist der mächtigste Typ in C und C++. Seine Genauigkeit ist normalerweise so festgelegt, dass sowohl sämtliche Integer-Typen, als auch alle Fliesskomma-Typen exakt umgewandelt werden können.

Arithmetische Umwandlungen von Fliesskomma-Werten sollten jedoch wenn immer möglich vermieden werden, egal ob sie implizit oder explizit mittels Casts erwirkt werden. Sie sind auch in modernen Prozessoren immer noch sehr kostspielig. Hierbei ist ausserdem zu beachten, dass in bestimmten Situationen Fliesskomma-Werte automatisch in einen double konvertiert werden (siehe Promotion).