Beschleunigte Funktion für Quadratwurzel


  • Mod

    Erhard Henkes schrieb:

    // Null und negative Zahlen abfangen
        //if( r == 0.0f ) return 0.0f;
        if( r <  0.0f ) r = -r     ;
    

    Die negativen Zahlen sollte man schon abfangen, sonst ergibt es: -1.#IND

    dafür gibt es eine funktion, die ist schneller als ein conditinal jump.

    rapso->greets();



  • Ich denke rapso meint hier fabs (oder auch fabsf für single precision Werte) aber da die Funktion viel mit der Integerunit arbeitet, würde ich hier mit einem weiteren Integer das Signbit wegmaskieren. Sonst lädt man den Wert in die FPU, generiert dort den absoluten Wert um in kurz danach wieder zurück in ein GPR zu verschieben.

    cya
    liquid



  • Ich würde die ifs komplett weglassen.

    sqrt(-1) ist nunmal nicht 1. Warum dann so tun? Wie wär's mit einem

    assert(r>=0.0f);
    

    ?

    MfG Jester



  • Afaik werden Asserts im Non-Debug Modus deaktiviert.

    cya
    liquid



  • Das ist ja auch der Sinn der Sache. Ich halte es auch für unsinnig, kommentarlos ein falsches Ergebnis zurückzuliefern.

    Kannst ja ein std::complex werfen. 🤡



  • Ich wollte darauf hinaus, dass negative Fälle dann beim Release nicht mehr abgefangen werde. Keine Ahnung ob das so beabsichtigt ist.

    cya
    liquid



  • Ja, denke ich mal. Die Wahrscheinlichkeit ist nach gründlichem Testen wohl sehr groß, dass nur korrekte Parameter übergeben werden.
    Und sonst isses halt undefiniertes Verhalten. Gibt's ja in C++ eh genug. 🤡 Eine Wurzelfunktion ist IMHO zu kritisch, um sich solche Tests zu erlauben. sqrt() aus <cmath> macht es ja auch nicht.

    EDIT: Mit "falsches Ergebnis" oben meinte ich nicht direkt ein falsches Ergebnis wie -1#IND zurückliefern, sondern ein Ergebnis, wo man nachher nicht mehr erkennen kann, dass es falsch ist, wie 1.0 bei sqrt(-1.0). Das halte ich für Unsinn.



  • http://assemblyrequired.crashworks.org/2009/10/16/timing-square-root/ als aktuelle Ergänzung dieses stets interessanten Themas.



  • TGGC schrieb:

    Ich benutze die Funktionen aus <cmath>, da ich noch kein Problem damit hatte.

    👍
    Die meisten Compiler kennen diese Funktionen sowieso als Intrinsics, würde mich wundern, wenn man den Compiler da irgendwie übertreffen könnte...



  • dot schrieb:

    TGGC schrieb:

    Ich benutze die Funktionen aus <cmath>, da ich noch kein Problem damit hatte.

    👍
    Die meisten Compiler kennen diese Funktionen sowieso als Intrinsics, würde mich wundern, wenn man den Compiler da irgendwie übertreffen könnte...

    cmath garantiert lediglich die korrektheit, nicht geschwindigkeit. die meisten spiele hatten deswegen ihre eigenen wurzel funktionen.
    auf konsolen ist das auch weiterhin ueblic, da die emulation der korrekten wurzel weitaus teurer ist, als eine approximierte version (bei der man z.b. das vorzeichen immer als positiv annimmt usw.)


Anmelden zum Antworten