Verstehe float-Vergleich nicht !
-
Weil in dem Beitrag steht, dass es meistens viel schneller ist. Ich hab mir das hauptsächlich angeschaut, da man ja manchmal noch irgendwo 1-2% Geschw. sucht, aber hauptsächlich hab ichs einfach nicht kapiert, und sowas wurmt mich.
Was das 0x7fffffff genau ist, hab ich immer noch nicht kapiert. Gibt es noch mehr signifikante Hex-Zeichen, die man wissen sollte ?
Gruss
-
CatDog11 schrieb:
Weil in dem Beitrag steht, dass es meistens viel schneller ist.
Ich würd solche Mikrooptimierungen lieber dem Compiler überlassen bis ich wirklich ein Performanceproblem hab und gemessen hab dass tatsächlich diese float Vergleichen daran schuld sind. Um ehrlich zu sein würds mich nicht wundern wenn der Compiler sogar besser optimieren würde als dieser Hack...
CatDog11 schrieb:
Was das 0x7fffffff genau ist, hab ich immer noch nicht kapiert.
0x7FFFFFFF entspricht binär 01111111 11111111 11111111 11111111.
-
camper schrieb:
Eine Version für double könnte so aussehen:
Eine Version für double könnte so aussehen:
-
Wutz schrieb:
camper schrieb:
Eine Version für double könnte so aussehen:
Eine Version für double könnte so aussehen:
1. vergleicht das auf exakt 0 und nicht auf |x| < epsilon und
2. versteh ich nicht warum man da nicht einfach x == 0.0 machen sollte
-
dot schrieb:
camper schrieb:
Zunächst einmal ist das Ganze undefiniert [...]
Das isses doch so oder so!?
Warum?
-
camper schrieb:
dot schrieb:
camper schrieb:
Zunächst einmal ist das Ganze undefiniert [...]
Das isses doch so oder so!?
Warum?
Na weil der Standard überhaupt keine Aussagen über das Bitmuster eines float macht...
Aber gut was das Aliasing angeht hast du natürlich recht.
-
dot schrieb:
Na weil der Standard überhaupt keine Aussagen über das Bitmuster eines float macht...
13.9.1/8 schrieb:
The value representation of floating-point types is implementation-defined.
ist ein bisschen mehr als keine Aussage.
-
dot schrieb:
Wutz schrieb:
camper schrieb:
Eine Version für double könnte so aussehen:
Eine Version für double könnte so aussehen:
1. vergleicht das auf exakt 0 und nicht auf |x| < epsilon und
2. versteh ich nicht warum man da nicht einfach x == 0.0 machen solltex == 0.0 ist schlecht, weil es z.B. auch -0.0 im floating point format gibt

allen, die sicht mit floating point rumaergern muessen, kann ich nur Empfehlen mal einen Blick auf diesen Aufsatz zu werfen:
http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html
gruss
Dirk
-
dbu schrieb:
x == 0.0 ist schlecht, weil es z.B. auch -0.0 im floating point format gibt

Das wäre ein weiteres Problem im von Wutz verlinkten Code. Der normale Vergleich mit == sollte damit allerdings kein Problem haben (wenn wir davon ausgehen dass es sich um IEEE 754 floats handelt).
dbu schrieb:
http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html
Ja der Artikel ist wirklich jedem sehr zu empfehlen.
-
CatDog11 schrieb:
bool CompareZero(float f, float tolerance) { int fi = *reinterpret_cast<int*>(&f); int ti = *reinterpret_cast<int*>(&tolerance); return (fi & 0x7fffffff) <= ti; }Wenn du schon eine eigene Funktion dafür einsetzen möchtest, dann bitte nicht mit casts sondern schlicht und einfach mit einer Abfrage if fabs(f < tolerance) oder dasselbe mit fabsl.