Zitat von
SnuffMaster23:
Entweder (x<e || x>-e) oder ((x&0x7FFFFFFF)<e).
Letzteres ist mit C++ syntaktisch so nicht möglich, da für Gleitkommatypen keine Bitoperatoren exisiteren. Da Gleitkommazahlen aber
genormt sind, braucht dich das nicht daran zu hindern, es trotzdem so zu machen:
Code:
inline bool isNull (float val, float e = 0.00001f)
{
*reinterpret_cast <int*> (&val) &= 0x7FFFFFFF;
return (val < e);
}
inline bool isNull (double val, double e = 0.000000001)
{
*reinterpret_cast <long long*> (&val) &= 0x7FFFFFFFFFFFFFFFul;
return (val < e);
}
Für vorzeichenbehaftete Integerwerte funktioniert deine Vergleichsmethode übrigens auch nicht, da diese anders dargestellt werden, als du annimmst; hier am Beispiel einer 1-Byte-Zahl:
http://img138.imageshack.us/img138/9...gnedintml7.gif
Aus diesem Grund ist ~0 (der unäre Operator ~ in C negiert den Parameter bitweise) gleichwertig mit -1, unabhängig davon, wie breit der Datentyp ist.