Asumo se requiere truncamiento, igual que si uno escribe i = (int)f
en "C".
Si tiene SSE3, puede utilizar:
int convert(float x)
{
int n;
__asm {
fld x
fisttp n // the extra 't' means truncate
}
return n;
}
Alternativamente, con SSE2 (o en x64, donde ensamblado en línea podría no estar disponible), se puede utilizar casi tan rápido:
#include <xmmintrin.h>
int convert(float x)
{
return _mm_cvtt_ss2si(_mm_load_ss(&x)); // extra 't' means truncate
}
En las computadoras más antiguas, hay una opción para configurar el modo de redondeo de forma manual y realizar la conversión utilizando la instrucción ordinaria fistp
.Probablemente esto solo funcionará para matrices de flotadores, de lo contrario se debe tener cuidado de no utilizar ninguna construcción que haga que el compilador cambie el modo de redondeo (como el fundido). Se realiza así:
void Set_Trunc()
{
// cw is a 16-bit register [_ _ _ ic rc1 rc0 pc1 pc0 iem _ pm um om zm dm im]
__asm {
push ax // use stack to store the control word
fnstcw word ptr [esp]
fwait // needed to make sure the control word is there
mov ax, word ptr [esp] // or pop ax ...
or ax, 0xc00 // set both rc bits (alternately "or ah, 0xc")
mov word ptr [esp], ax // ... and push ax
fldcw word ptr [esp]
pop ax
}
}
void convertArray(int *dest, const float *src, int n)
{
Set_Trunc();
__asm {
mov eax, src
mov edx, dest
mov ecx, n // load loop variables
cmp ecx, 0
je bottom // handle zero-length arrays
top:
fld dword ptr [eax]
fistp dword ptr [edx]
loop top // decrement ecx, jump to top
bottom:
}
}
Tenga en cuenta que el ensamblaje en línea sólo funciona con los compiladores de Visual Studio de Microsoft (y tal vez de Borland), que tendría que ser reescrito para el montaje de GNU con el fin de compilar con gcc. Sin embargo, la solución SSE2 con intrínsecos debería ser bastante portátil.
Otros modos de redondeo son posibles por diferentes intrínsecos SSE2 o manualmente ajustando la palabra de control FPU a un modo de redondeo diferente.
Cambiar de un Pentium 5 a un chip que hace matemáticas bien ... (Hombre que me hace sentir viejo ...) – JBB
Estoy rodando por el suelo. Dang - ¡es una lástima que la gente te modifique por eso! – Kevin
Valió la pena. :) – JBB