ASM + Modulo

  • Hallo, ich suche ein Modulo, das auch (oder auch nur) mit Fließkommazahlen klar kommt.

    Das normale X% MOD Y% arbeitet ja nur mit Integerzahlen.

    Da es auch schnell sein muß, käme mir ein ASM-Proc recht. Da der Inline-Assembler ja

    auch FPU - Befehle kann, denke ich, daß sowas hin zu bekommen ist.

    Vielleicht haben ja die Forumsmitglieder, die sich besser als ich in ASM auskennen,

    wie z.B. Volkmar oder p.Specht, eine Idee.

  • Hallo Heinz,


    ich habe das als fbPROC realisiert (JRPC3 erforderlich). Aber keine Angst, wenn Du JRPC3 nicht benutzen möchtest, ist die erzeugte native DLL hier beigefügt: fmod.zip


    Die Funktion FMOD@12 erwartet zwei Float-Werte. Da diese 8 Byte breit sind, DLL-Funktionsparameter aber stets 4 Byte breit sein müssen, sind hier die beiden zu verarbeitenden Werte als deren Adressen zu übergeben und als dritter Parameter die Adresse eines Float-Wertes, der das Ergebnis aufnimmt.


    Die Funktion SMOD@8 arbeitet mit Single-Werten, die 4 Byte breit sind und daher direkt übergeben werden können (nur zwei Parameter). Allerdings ist die Genauigkeit natürlich auch schlechter.


    Beste Grüße, Jens-Arne

  • Und hier noch eine Version mit abgefangenem "Division durch null"-Fehler: fmod.zip


  • Hallo nochmal,


    ich habe gerade festgestellt, dass die Single-Variante auch schneller ist als die genauere Float-Variante (ca. ein viertel).


    Da Du sagtest, dass es Dir auf Geschwindigkeit ankommt, wäre aber zu erwägen, dass Du die gesamte Berechnung in einer fbPROC ausführst. Denn jeder Funktionsaufruf benötigt aufgrund von Registergeschiebe Zeit, sodass es besser wäre, nur eine Funktion aufzurufen und darin alles zu berechnen, was es zu berechnen gibt, als innerhalb einer Schleife tausendfach die eine Funktion aufzurufen, die nur die Modulo-Funktion ausführt.


    Zum Vergleich:

    10.000 Mal smod aus einer Profan-Schleife aufrufen: 268ms

    10.000 Mal smod-Berechnung innerhalb einer fbPROC: 0ms (!!! - also "off scale low")


    Im ersten Fall kosten also keinesfalls die Berechnungen an sich irgendeine messbare Zeit, sondern allein die 10.000 Funktionsaufrufe.

    Allerdings ist das immer noch viel besser, als das in reinem XProfan zu schreiben (2 Sekunden).

    Vermutlich ist die Single-Variante von außen gesehen auch nur deshalb schneller, weil sie einen Parameter weniger hat.


    Gruß, Jens-Arne

    3 Mal editiert, zuletzt von Jens-Arne ()

  • Interessant! Was kommt dann bei Pi() mod exp(1) raus? Und ist das Ergebnis bei "unendiich" langen Kommastellen sinnvoll? :8O: :8O: :8O:

    HP255G7:Win10pro2.004,4*AMD Ryzen3200U@2.60GHz,6+2GB-RadeonVega/237GBSSD:intlDVDRW,3xUSB3 ext4TB-HDX,XProfanX3+Xasm/Xpse

  • Naja, die Grenzen von Gleitkommaoperationen sollte man schon kennen, wenn man diese Funktion verwendet. Pi ist z.B. überhaupt nicht als Gleitkommazahl darstellbar (nicht exakt jedenfalls). Mir reicht aber für alle Lebenslagen die grobe Approximierung 3,14159. Da wird das Ei schon rund werden. ;)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!