float Typ

Der Typ float speichert eine Realzahl, welche als Fliesskommazahl mit 4 Bytes codiert wird. Ein float kann den Wertebereich von 1.175494e-38 bis 3.402823e+38 auf 6 Nachkommastellen genau abbilden, sowohl positiv, als auch negativ.

Details

Der Typ float ist eine 32-Bit-Fliesskommazahl mit einer 23-Bit Mantisse. Dies entspricht dem Fliesskomma-Typ für einfache 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 float auf dem System des Autors:





1.175494e-38
3.402823e+38
24
6
-125
-37
128
38
1.192093e-07
#include <stdio.h>
#include <float.h>

int main(){
  printf("%e\n",  FLT_MIN);         // smallest value
  printf("%e\n",  FLT_MAX);         // biggest value
  printf("%i\n",  FLT_MANT_DIG);    // radix digits of mantissa
  printf("%i\n",  FLT_DIG);         // accurate decimal digits
  printf("%i\n",  FLT_MIN_EXP);     // minimal radix exponent
  printf("%i\n",  FLT_MIN_10_EXP);  // minimal decimal exponent
  printf("%i\n",  FLT_MAX_EXP);     // maximal radix exponent
  printf("%i\n",  FLT_MAX_10_EXP);  // maximal decimal exponent
  printf("%e\n",  FLT_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 32 Bits verpackt wird, wird auf die Fliesskommacodierung verwiesen.

Bei der Angabe von festen Werten im Quellcode können float-Werten ein kleines f oder ein grosses F als Suffix angehängt werden. Beide Suffixe bedeuten dasselbe, es wird jedoch normalerweise die Kleinbuchstaben-Variante verwendet. Ohne dieses 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 float-Typ werden durch den Compiler gegebenfalls arithmetische Umwandlungen durchgeführt. Im folgenden sind die Umwandlungsregeln für den float-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 float wird versucht, die Zahl wenn immer möglich exakt zu representieren. Da ein float jedoch nur 6 genaue Nachkommastellen abbilden kann, können dementsprechen nur Integer-Werte bis und mit 7 Dezimalziffern garantiert exakt gespeichert werden.



 7654321
87654320
float f1 =  7654321;
float f2 = 87654321;
printf(" %1.0f\n", f1);
printf("%1.0f\n", f2);

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





1234.567749
inf
double d1 = 1234.5678;
double d2 = 1e100;
float f1 = d1;
float f2 = d2;
printf("%f\n", f1);
printf("%f\n", f2);