Vorzeichen von float entfernen



  • 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?



  • (s)kipper schrieb:

    warum tut man nicht einfach msb löschen?

    Weil man bei float nicht so einfach und plattformunabhängig ans MSB herankommt.



  • (s)kipper schrieb:

    warum tut man nicht einfach msb löschen?

    weil's nicht portabel ist. z.b. abhängig von endianness und wie floats überhaupt gespeichert werden, muss ja nicht immer ieee 754 (dieses format mit den zwei nullen) sein.
    🙂



  • +fricky schrieb:

    ... muss ja nicht immer ieee 754 (dieses format mit den zwei nullen) sein.
    🙂

    andere darstellungsformen wird man wohl nicht in der praxis anfinden, vermute ich mal?



  • vermuter schrieb:

    +fricky schrieb:

    ... muss ja nicht immer ieee 754 (dieses format mit den zwei nullen) sein.
    🙂

    andere darstellungsformen wird man wohl nicht in der praxis anfinden, vermute ich mal?

    Da vermutest Du falsch.



  • Tachyon schrieb:

    Da vermutest Du falsch.

    hast du mal ein beispiel, quellen, links?


Anmelden zum Antworten