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 zufloat 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 übergebenund dieser es wieder einschaltet:
fldcw word ptr [old_cword] ; altes controlword mit alten einstellungen übergeben