Bitweise Invertierung von Gleitkommazahlen
-
Moin,
hat jemand eine Idee, wie ich eine bitweise Invertierung von Fliesskommazahlen realisieren kann? Bei Ganzzahlen geht das ja über den ~Operator.
Grüsse
-
musst du denn operator selbst schreiben? wenn nicht multipliziere einfach mit zwei
ansonst schau dir mal das Bitmuster von einer Gleitkommazahl an, ich weiß momentan auch nicht wie es aussieht, und invertiere halt jedes bit und das komma nicht vergessenwenn du noch einen tag wartest könnte ich dir den code auch posten hab momentan nur begrenzt Zugang zum pc
-
Wofür brauchst Du das?
Du weißt wie Gleitkommazahlen gespeichert werden?Ungetested und nur als Anregung:
union{ float a; char b[sizeof(float)]; } ... a=1.23456 for(int i=0;i<sizeof(float);i++) ~b[i]; cout << a;
DJohn
-
Ich würds halt byteweise von Hand im Speicher machen, etwa so:
double invert_double(double d) { char *p; for(int i = 0; i < sizeof(double); ++i) { p = reinterpret_cast<char*>(&d) + i; *p = ~*p; } return d; }
-
hallo,
ja ich bevorzuge auch die letzte variante. hab mir jetzt was geschrieben, wo ich byteweise kopiere mit memmove (außerdem noch datentyp-abhängig mit sizeof(...)).
danke für die anregungen
-
leo aka qsch schrieb:
musst du denn operator selbst schreiben? wenn nicht multipliziere einfach mit zwei
Mhh, wie soll das denn funktionieren?
@Larissa
Ich würde gar nicht so einen Aufwand betreiben. Definier dir einfach einen Integer-Typ, der so gross wie float ist. Auf gängigen 32-Bit Systemen könnte das zB so aussehentypedef long int_float_type;
Und dann castest du einfach
float a = 1.25; float a_tmp = ~*reinterpret_cast<int_float_type*>(&a); float a_inverted = *reinterpret_cast<float*>(&a_tmp);
Ne zweite Möglichkeit wäre, dies, wie DJohn, über unions zu machen.
union int_float_union { float as_float; int_float_type as_int; }; int_float_union a; a.as_float = 1.25; a.as_int = ~a.as_int; float a_inverted = a.as_float;