double Typ

Der Typ double speichert eine Realzahl, welche als Fliesskommazahl mit 8 Bytes codiert wird. Ein double kann den Wertebereich von 2.225074e-308 bis 1.797693e+308 auf 15 Nachkommastellen genau abbilden, sowohl positiv, als auch negativ.

Details

Der Typ double ist eine 64-Bit-Fliesskommazahl mit einer 52-Bit Mantisse. Dies entspricht dem Fliesskomma-Typ für doppelte Genauigkeit in der IEEE 754 Norm. In der floats-Bibliothek sind einige Makros definiert, welche den Wertebereich von Fliesskommatypen genauer spezifizieren. Folgendes Programm liefert die Werte für den Typ double auf dem System des Autors:





2.225074e-308
1.797693e+308
53
15
-1021
-307
1024
308
2.220446e-16
#include <stdio.h>
#include <float.h>

int main(){
  printf("%e\n",  DBL_MIN);         // smallest value
  printf("%e\n",  DBL_MAX);         // biggest value
  printf("%i\n",  DBL_MANT_DIG);    // radix digits of mantissa
  printf("%i\n",  DBL_DIG);         // accurate decimal digits
  printf("%i\n",  DBL_MIN_EXP);     // minimal radix exponent
  printf("%i\n",  DBL_MIN_10_EXP);  // minimal decimal exponent
  printf("%i\n",  DBL_MAX_EXP);     // maximal radix exponent
  printf("%i\n",  DBL_MAX_10_EXP);  // maximal decimal exponent
  printf("%e\n",  DBL_EPSILON);     // machine epsilon
  return 0;
}

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

Bei der Angabe von festen Werten im Quellcode werden Fliesskommazahlen standardmässig als double-Werte angenommen. Durch die Angabe eines Suffix kann dem Compiler gegebenfalls angegeben werden, dass es sich um einen float-Wert oder einen long double-Wert handelt.

float
double
long double
1.234f
1.234
1.234L

Arithmetische Umwandlung

Bei Zuweisungen, Initialisierungen oder Casts zu einem double-Typ werden durch den Compiler gegebenfalls arithmetische Umwandlungen durchgeführt. Im folgenden sind die Umwandlungsregeln für den double-Typ beschrieben. In manchen Fällen gibt ein Compiler bei einer unsicheren Umwandlungen eine Warnung aus, welche jedoch bei Bedarf mittels eines expliziten Casts unterdrückt werden kann.

Arithmetische Umwandlungen von Fliesskomma-Werten sollten 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).

Bei der Umwandlung eines Integer-Typs in einen double wird versucht, die Zahl wenn immer möglich exakt zu representieren. Da ein double jedoch 15 Nachkommastellen exakt abbilden kann, können dementsprechen alle Integer-Werte bis und mit 16 Dezimalziffern garantiert exakt gespeichert werden. Dies ist für die allermeisten Fälle ausreichend, kann jedoch bei long long-Werten zu Problemen führen:



 6543210987654321
76543210987654320
double d1 =  6543210987654321LL;
double d2 = 76543210987654321LL;
printf(" %1.0f\n", d1);
printf("%1.0f\n", d2);

Wenn ein long double in einen double umgewandelt wird, wird ebenfalls versucht, die Zahl so exakt wie möglich zu representieren. Hat die umzuwandelnde Fliesskommazahl keinen Platz in einem double, so wird der maximal, beziehungsweise der minimal mögliche Wert angenommen: +-infinity





1234.567800
inf
long double l1 = 1234.5678;
long double l2 = 1e400L;
double d1 = l1;
double d2 = l2;
printf("%f\n", d1);
printf("%f\n", d2);  return 0;

Bei einer Umwandlung eines float in einen double kann der Wert in jedem Falle exakt gespeichert werden.