acos per FPU bzw. ISSE?



  • Hi,

    ihr kennt doch aus C sicherlich die Funktion acosf.

    Gibt es von der FPU dafür auch Interrupte um den Arcus Kosinus zu berechnen oder sogar bei ISSE?

    Großes Danke im voraus!



  • Du kannst es über den Umweg mit arctan berechen:

    arccos(x) = arctan( sqrt(1-x²) / x ) für x>0
    arccos(x) = arctan( sqrt(1-x²) / x ) + PI für x<0

    Lade x nach ST(0)
    10247928 D9 E8 fld1
    1024792A D8 C1 fadd st,st(1)
    1024792C D9 E8 fld1
    1024792E D8 E2 fsub st,st(2)
    10247930 DE C9 fmulp st(1),st
    10247932 D9 FA fsqrt
    10247934 D9 C9 fxch st(1)
    10247936 D9 F3 fpatan



  • Schöner Stück Code, wäre nie darauf gekommen, die Formel (1-x)(1+x)=1-x^2 auszunutzen!
    Wie würdest du die Unterscheidung x > 0 oder x < 0 machen?



  • eigentlich hat die formel im vergleich wenig nutzen:

    fld    st(0)
        fmul   st, st
        fld1
        fsubrp st(1), st
    

    im uebrigen fehlt /x und der zweite parameter fuer'n partiellen tangens.

    Wie würdest du die Unterscheidung x > 0 oder x < 0 machen?

    zb x (float) in cpu-register laden, vorzeichen nach unten shiften und aus ner table[2] 0 oder pi addieren.



  • und bei double/long double könnte man analog die oberen 4 Byte laden und shiften...
    Und bei long double wäre es vielleicht besser, nur die oberen 2 Bytes zu laden, wenn die Zahl an der Adresse steht, die durch 4 oder 8 teilbar ist?


  • Mod

    oder man benutzt einfach mal ftst
    den fall x=0 muss man ja schließlich auch noch aussortieren



  • hi, interessanter topic.

    nur 3 fragen:
    1. Kann man den Code von AZ für acos problemlos benutzen? und ist dieser schnell?
    2. was bedeutet diese ganzen zahlen bei AZ: 10247928 D9 E8 ?
    3. Gibt es sowas auch mit SSE oder 3DNow!?

    Danke im voraus 🙂



  • der code von AZ ist ein teil des disassemblat der vc.net-acos-routine (layout: adresse, opcode, mnemonic) - es fehlen jegliche bereichspruefungen.
    die "fpatan"-instruction liegt bei ~130 cycles.
    mit isse/3dnow wuerde man eher naeherungsloesungen per approximation realisieren.


Anmelden zum Antworten