asin, acos und Frage zu FRNDINT



  • Hi,
    ich schreib gerade eine Mini-Mathe-Lib in C++, ohne dabei <math.h> zu verwenden. Deswegen hab ich die Mathe-Funktionen mit Hilfe der ASM-Befehle fsin, fcos, fptan, fpatan, fsqrt usw. geschrieben.
    Ich habe nicht sehr viel Erfahrung mit ASM, bzw. eigentlich gar keine. Ich hab die Funktionen nur mit Hilfe einer FPU-Referenz geschaft. Allerding finde ich keine Befehle für asin und acos.
    Wie kann ich diese implementieren?

    Und noch eine Frage zu dem Befehl FRNDINT:
    Dabei muss ich im Control Register (bit 10 & 11) angeben, weilcher Algorithmus benutzt werden soll. Also 00=näheste, 01=abrunden und 10=aufrunden.
    Aber wie setze ich diese bits?



  • Hi.

    Was ich zumindest mit Sicherheit nach meinem minimalen Umgang mit der fpu weiss: die fpu hat keine Funktionen fuer asin und acos. Lediglich fuer atan (fpatan), also wirst du da wohl ein wenig um die Ecke rechnen muessen... 😉

    Zu deiner 2. Frage:
    Mit fldcw kannst du das Controlword mit einem Wert aus dem Speicher setzen.
    Mit fstcw kannst du es in den Speicher schreiben.
    Ansonsten stimmt das schon, was du geschrieben hast.
    Nur eine Ergaenzung: Sind Bit 10 und 11 gesetzt, wird der Nachkommaanteil bei Konvertierung zu int abgeschnitten.



  • Auf- und abrunden funktioniert jetzt, aber normales runden irgendwie nicht. Es wird immer abgerundet. Hier mal der Code:

    inline float Round(float f)
    {
        uint16 control;
        _asm
        {
            fstcw control
            mov ax, control
            and ax, 0xf3ff //1111001111111111
            or ax, 0x0C00  //0000110000000000
            mov control, ax
            fldcw control
            fld f
            frndint
            fstp f
        }
        return f;
    }
    


  • Jo, wenn der Nachkommaanteil einfach abgeschnitten wird, kann man das auch schlecht als Aufrunden bezeichnen... 😕
    Von daher verstehe ich dein Problem nicht ganz.
    Aber um Missverstaendnissen vorzubeugen koenntest du nochmal ein Zahlenbeispiel posten.



  • shit, sorry, hab 00 und 11 vertauscht


Anmelden zum Antworten