Vergleich Bits von Float und Integer
-
Hallo,
ich möchte die Bit-Repräsentation eines floats mit einem integer vergleichen. Z.B. möchte ich wissen ob ein float f einem 0xFF entspricht.
Eine mögliche Variante ist:float f = getFloat(); int a = 0xFF; if ( f == *((float*)&a) ); { //... }
Meine erste Frage: Ist so ein Vergleich gültig??
Meine zweite Frage: Kann ich den Vergleich auch ohne Hilfe der Variable a durchführen?
-
ZzetT schrieb:
Meine erste Frage: Ist so ein Vergleich gültig??
Da hätte ich meine Zweifel, da dein a nicht sicher eine gültige float-Repräsentation ist. Bedenke auch, dass float-Gleichheit etwas anderes ist als bitweise Gleichheit, siehe NaN, +/- Null usw.
Meine zweite Frage: Kann ich den Vergleich auch ohne Hilfe der Variable a durchführen?
Indem du es umgekehrt machst:
if (*(int*)&f == 0xFF) ...
Funktioniert natürlich auch nur, wenn int und float gleich groß sind, aber das ist ohnehin klar.
-
Da hätte ich meine Zweifel, da dein a nicht sicher eine gültige float-Repräsentation ist.
D.h. es gibt keine Möglichkeit in C auf die Bit Repräsentation eines Floats zu testen?
-
Doch, aber für Basteleien mit den Bits ist die Gleitkomma-Arithmetik nicht geeignet. Deswegen mußt du (wie Bashar schon sagte) den Wert als int oder vergleichbares interpretieren, um an die einzelnen Bits herankommen zu können.
-
Ja, das verstehe ich.
Meine Annahme ist, dass die Register vom Float exakt 0xFF enthalten.
Jetzt ist nur meine Frage ob durch die Interpretation in einen Integer doch etwas anderes herauskommen kann als 0xFF?
-
Der Datentyp float ist ein zusammengesetzter Datentyp aus Mantisse und Exponent, beide intern binär. Direkte Vergleiche sind schwer möglich. Sobald man es mit float zu tun hat, benötigt man für Vergleiche eine Toleranzgrösse, z.B eps = 0.001. Die Bits interessieren nicht!
-
ZzetT schrieb:
Meine Annahme ist, dass die Register vom Float exakt 0xFF enthalten.
Sobald du die Adresse von etwas nimmst, kann es sich nicht mehr in einem Register befinden.
Ansonsten ist das keine triviale Frage; es hängt stark davon ab, wie die Plattform Fließkommazahlen normalisiert - 0x000000ff nach Float gecastet ist ja keine normale Darstellung. Ich würde mich auf jeden Fall nicht darauf verlassen, dass so etwas zuverlässig überall klappt.