Vorzeichen von float entfernen
-
Sprich du wirst eine Konvertierung von float nach double bekommen und einmal andersrum. Also wenn es um eine geschwindigkeitskritische Sache geht, würde ich doch lieber fabsf nehmen.
rüdiger schrieb:
oder C++, da gibt es nämlich Funktionsüberladungen
...die die konvertierung zu 'double' und zurück heimlich machen:
inline float __CRTDECL abs(__in float _X) {return (fabsf(_X)); } ... inline float fabsf(__in float _X) {return ([b](float)[/b]fabs([b](double)[/b]_X)); }
^^auszug aus visual-c++'s 'math.h'.
jaja, C++ ist schon unglaublich benutzerfreundlich.
-
Das ist natürlich blöd gemacht von den VC++-Leuten. Naja, die wollen wohl den Markt für optimierte Mathebibliotheken offen halten ;).
inline float abs(float __x) { return __builtin_fabsf(__x); }
so schaut's im GCC 4.3 aus.
-
rüdiger schrieb:
so schaut's im GCC 4.3 aus.
ein pluspunkt für den GCC. trotzdem würde ich nicht leichtfertig sagen 'nimm c++', sondern eher 'wenn du c++ nehmen solltest, dann achte darauf, dass du den GCC verwendest'.
-
man kann natürlich auch ein bisschen in die trickkiste greifen
das vorzeichen wird durch das erste bit angegeben.
(folgender code setzt little edian vorraus)inline void removesign(float &f) { *reinterpret_cast<int *>(&f) &= 0x8fffffff; } inline float fabsf(float f) { removesign(f); return f; }
-
tipp schrieb:
man kann natürlich auch ein bisschen in die trickkiste greifen
welch übler hack. mach's doch so, das kommt auch ohne konvertierung aus:
inline float fabsf(float x) { if (x < 0.0f) return -x; return x; }
-
tipp schrieb:
man kann natürlich auch ein bisschen in die trickkiste greifen
braucht man ja nicht weiter kommentieren :p
+fricky schrieb:
tipp schrieb:
man kann natürlich auch ein bisschen in die trickkiste greifen
welch übler hack. mach's doch so, das kommt auch ohne konvertierung aus:
inline float fabsf(float x) { if (x < 0.0f) return -x; return x; }
Nicht nur dass es deutlich langsamer sein dürfte, es kommt zB mit -0.0f nicht klar.
-
rüdiger schrieb:
Nicht nur dass es deutlich langsamer sein dürfte, es kommt zB mit -0.0f nicht klar.
stell dich nicht so an. mit 'ner -0 kannste normal weiterrechnen, als wär's eine echte 0. was erzähl ich da: es *ist* eine richtige 0.
-
Du kannst auch mit -1.0f weiter rechnen. Warum sollte man also das Vorzeichen überhaupt entfernen wollen
. Dein fabsf kann einfach dazu führen, das
fabsf(a)/fabsf(b) < 0.0f
ist und das sollte nicht sein. Zumal deine Version deutlich langsamer sein dürfte, als die Konvertierung von float nach double und zurück.
-
rüdiger schrieb:
Dein fabsf kann einfach dazu führen, das
fabsf(a)/fabsf(b) < 0.0f
ist und das sollte nicht sein.für welche a und b?
-
Vielleicht mal auf ein altbekanntes Macro hingewiesen:
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
-
hartmut1164 schrieb:
Vielleicht mal auf ein altbekanntes Macro hingewiesen:
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
Ja ... das ist auch toll!
-
hartmut1164 schrieb:
Vielleicht mal auf ein altbekanntes Macro hingewiesen:
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
Ich meinte natuerlich das hier:
define ABS(x) ((x<0) ? (-1*(x)) : x)
-
volkard schrieb:
rüdiger schrieb:
Dein fabsf kann einfach dazu führen, das
fabsf(a)/fabsf(b) < 0.0f
ist und das sollte nicht sein.für welche a und b?
b=-0.0f und a beliebig.
hartmut1164 schrieb:
Ich meinte natuerlich das hier:
define ABS(x) ((x<0) ? (-1*(x)) : x)
Kommt auch mit -0.0f nicht zurecht und ist außerdem ein Macro, obwohl es keins sein müsste.Die einzig sinnvolle Lösung ist fabsf. Im Notfall (kein C99-Compiler) eben fabs.
-
rüdiger schrieb:
volkard schrieb:
rüdiger schrieb:
Dein fabsf kann einfach dazu führen, das
fabsf(a)/fabsf(b) < 0.0f
ist und das sollte nicht sein.für welche a und b?
b=-0.0f und a beliebig.
achsoo. du meinst, daß -inf statt +inf rauskommt.
-
Oder halt auch +nan oder -nan
-
Tim schrieb:
Oder halt auch +nan oder -nan
minus not a number?
-
Du kannst auch mit -1.0f weiter rechnen. Warum sollte man also das Vorzeichen überhaupt entfernen wollen
[/quote]
weil der unterschied zwichen -1 und 1 gross ist, aber -0 ist ist eben auch nur eine 0.rüdiger schrieb:
volkard schrieb:
rüdiger schrieb:
Dein fabsf kann einfach dazu führen, das
fabsf(a)/fabsf(b) < 0.0f
ist und das sollte nicht sein.für welche a und b?
b=-0.0f und a beliebig.
du willst durch 0 teilen? dann schau mal hier: http://de.wikipedia.org/wiki/Permanenzprinzip#Anwendung_bei_der_Division_durch_Null
-
@+fricky
Worüber willst du nun eigentlich diskutieren? Deine Lösung ist langsamer, deckt nicht alle Fälle ab und verhält sich nicht, so wie man es erwartet. Da muss man nicht mehr zu sagen.
-
rüdiger schrieb:
Worüber willst du nun eigentlich diskutieren?
z.b. darüber, warum sich jemand an unbedeutenden kleinigkeiten hochzieht. du erzählst was von 'dann braucht man -1.0 auch nicht umzudrehen', pochst auf langsamkeit, die nicht bewiesen ist, etc. das ist schon diskussionswürdig.
rüdiger schrieb:
Deine Lösung ist langsamer,
wie kommst du darauf?
rüdiger schrieb:
deckt nicht alle Fälle ab
nur einen nicht. aber der dürfte meistens keine rolle spielen.
rüdiger schrieb:
und verhält sich nicht, so wie man es erwartet
wieso nicht? es spuckt positive floats auf, bis aus diesen einen speziellen fall, der aber, wie schon gesagt, oft ohne belang ist.
-
warum tut man nicht einfach msb löschen?