Float nach Integer konvertieren



  • Hi Leute!
    Folgender Code sollte eigentlich die Nachkommastellen eines Floats abschneiden. Leider rundet er bei mir. Ich brauche aber das Pendant zu

    float y = 2.645f;
    int x = (int)y; // wird zu 3 statt 2!!!
    
    // Fast float to int conversion, NEVER cast with (int) when
    // performance has any importance
    __forceinline void FloatToInt(int *int_pointer, float f){
        __asm {
            fld f;
            mov edx, int_pointer;
            FRNDINT;
            fistp dword ptr [edx];
        }
    }
    

    Am besten in der Form:

    int FloatToInt(float f);
    

    Hat jemand diese Assembler-Funktion parat und kann sie posten?

    Vielen Dank



  • inline int f2i(float flt) 
    {
        volatile int n; 
    
        __asm 
        {
            fld flt
            fistp n
        }
    
        return n;
    }
    

    mfg Anaconda



  • Hmm, bei mir rundet er wieder. Kann man nicht einfach die Nachkommastellen abschneiden?



  • ja, dann musst du der fpu sagen wie sie runden soll:

    SCHNEIDE DIE MANTISSE AB:
     fstcw   word ptr [old_cword]       ; controlword sichern
     fstcw   word ptr [new_cword]       ; controlword zum bearbeiten laden
     or      word ptr [new_cword],0000110000000000b   ; setze entsprechende bits
     fldcw   word ptr [new_cword]       ; controlword an fpu übergeben
    
     fldcw   word ptr [old_cword]       ; alter controlword mit alten einstellungen übergeben
    


  • ich wollte noch vorsichtshalber sagen, dass volgender teil das runden abschaltet:
    fstcw word ptr [old_cword] ; controlword sichern
    fstcw word ptr [new_cword] ; controlword zum bearbeiten laden
    or word ptr [new_cword],0000110000000000b ; setze entsprechende bits
    fldcw word ptr [new_cword] ; controlword an fpu übergeben

    und dieser es wieder einschaltet:
    fldcw word ptr [old_cword] ; altes controlword mit alten einstellungen übergeben


Anmelden zum Antworten