floats mal wieder

Die Floating-Point-Darstellung ist immer mal wieder für eine Überraschung gut. So lässt sich explizit eine Null mit Vorzeichen darstellen. Der numerische Vergleich mit einer Null ohne Vorzeichen liefert den Wahrheitswert zurück, während eine Umwandlung in einen C-String vorzeichenbehaftet ist.

In die Falle kann man laufen, wenn man eine Ausgabe erzeugen will, bei dem ganze Zahlen angezeigt werden sollen. ceil liefert z.B. einen solchen “-0” – Wert. Folgendes Programm liefert die Ausgabe “Float-Vergleich: gleich, String-Vergleich: ungleich” :

#include <stdio.h>
#include <math.h>
#include <string.h>

int main()
{
    const float minusnull = ceil(-0.4f);
    char str[3];
    sprintf(str, "%.0f", minusnull);
    printf("Float-Vergleich: %sgleich, ", (minusnull == 0.0f )?"":"un");
    printf("String-Vergleich: %sgleich\n", (strncmp(str, "0", 2) == 0)?"":"un");
}