Mehrfaches Casten auf µC
-
Hallo,
ich beschäftige mich seit einiger Zeit mit Microcontroller-Programmierung mit verschiedenen C-Compilern - die sind ja immer wieder für kleinere Überraschungen gut.
Jedenfalls war ich ziemlich erstaunt über das Ergebnis dieses Ausdrucks:
float f = 1.5; if (f == (float)((int)f)) ...
Ich wollte nur feststellen ob f Kommastellen hat, f == (int)f reicht natürlich (so funktioniert es auch), ich wollt´s aber erst ganz genau machen und nur gleiche Typen mit gleichen vergleichen.
Also hab ich per cast nach int erst die Kommastelle abgeschnitten und zurück nach float - meiner Meinung nach. Der Compiler (CodeVision AVR) war da aber anderer Meinung, und hat f wieder mit Kommastelle zurück nach C gecastet und der Ausdruck ergab true
!
Bei dem MSC ergibt der Ausdruck false (so wie man es erwartet) - eine Warnung oder soetwas gab keiner der Compiler aus.
Meine Fragen dazu:
Ist das generell Unsinn was ich mach? (also das es nicht benötigt ist, ist mir klar, aber sind mehrfache casts überhaupt vorgesehen?)
Gibt der ANSI Standard her, dass dieser Ausdruck false ergeben muss? (Kenn mich mit den Details des technischen Hintergrunds nicht so aus)
thx,
Patrick
-
sieht so aus als würde dein compiler irrtümlicherweise eine optimierung machen und die casts unterschlagen. das ist aber nicht richtig so.
-
bluphx schrieb:
Ist das generell Unsinn was ich mach?
Nun, kommt drauf an. Mit der stdlib Implementierung für MC ist das immer so 'ne Sache, aber wenn dir floor zur Verfügung steht, dann ist deine Variante jedenfalls nicht sonderlich schön. Man macht dann besser sowas:
bool hat_nachkommastellen(float x) { return x != floor(x); }
Dann brauchst du dir zumindest keine Sorgen wegen int <-> float Genauigkeitsverlust machen.