[FPU] fdivp - instruction may be inaccurate on some Pentiums



  • Hi,

    ich versuche momentan mein Assembler wieder etwas aufzufrischen und hab mir deshalb wieder die FPU geschnappt. Ich habe begonnen indem ich einfache nathematische Funktionen schreibe, bei allein kein großes problem doch bei der tan-Funktion gab es ein Warning, bei dem ich nicht ganz weiter komme:

    warning C4725: instruction may be inaccurate on some Pentiums
    warning C4725: instruction may be inaccurate on some Pentiums

    Dabei geht es um die fdivp Instruktion.

    inline float tan (float value) 
    { 
        asm fld value 
        asm fsincos 
        asm fdivp st(1), st(0) ; << 
        asm fst value
    
        return value;
    }
    

    Ich möchte diese Warning aber auch nicht ignorieren, deshalb frag ich einfach mal wie man dieses Problem behebt. 🙂

    Danke im voraus!



  • Du kannst die Warnung getrost ignorieren. Die bezieht sich auf die alte, erste, Pentium I Serie (von ca. 1995).

    Sieht so aus, als ob Du VC++ verwendest ... in dem Fall kannst Du z.B. mit der Option "/G6" dem Compiler sagen, daß er Code für Pentium Pro Prozessoren und aufwärts erzeugen soll. Dann dürfte die Warnung verschwinden.



  • Power Off
    Vielen Dank für die Info 🙂 Mit /G6 ist es weg 🙂 Danke



  • Ist das dieser bekannte Pentium Bug?



  • Ja.



  • Achja mir ist da grade etwas sehr interessantes aufgefallen! Irgendwie ist das ergebnis total falsch?

    Geb ich in meinem Taschenrechner tan(45) ein ist das ergebnis ein anderes als das was ich von meiner Funktion zurück bekomme? Auch auf anderen Taschenrechnern das selbe Spiel? Hab Deg und Rad verglichen, irgendwie passt keines der Ergebnisse meiner Funktion zu denen welche ich auf meinen Taschenrechnern habe? 😕



  • Die Mathe-Funktionen der C Library arbeiten im Bogenmaß (Radians).

    D.h. 360° = 2.0 * PI, 180° = PI, 90° = PI / 2.0

    PI ist definiert als 3.141592646 .

    Du kannst Dir z.B. eine Umrechnungsfunktion schreiben:

    float deg2rad( float Winkel ) {
       return Winkel * 2.0f * 3.141592646f / 360.0f;
    }
    

    hoffe das hilft! 🙂


Anmelden zum Antworten