Pendant que j'écrivais un prog qui faisanit pas mal de conversion float vers int, j'ai regardé le code assembleur généré et je me suis aperçu que le prog passait son temps à modifier le registre de contrôle du FPU avant de faire sa conversion et perdait ainsi tu temps.
j'ai voulu vois ce que j'obtenai en faisant moi-même la conversion :
un float est représenté sous 32 bits comme ceci :
signe*1.m * 2^exp
bit 31 : signe.
bits 30..23 : exposant+127.
bits 22..0 : partie fractionnaire de la mantisse.
Source / Exemple :
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//******************************************************************
//******************************************************************
int ftoi(float f)
{
DWORD dw = *((DWORD*) &f);
if(dw == 0)
return 0;
char exp = (char) (((dw>>23)&0xFF)-127);
if(exp < 0 || exp > 23)
return 0;
int val = (1<<exp) + ((dw&0x7FFFFF)>>(23-exp));
if(dw&0x80000000)
return -val;
else
return val;
}
#define NB_BCL 100000000
float floatVal;
int intVal;
//******************************************************************
//******************************************************************
int main()
{
srand(GetTickCount()^GetCurrentProcessId());
DWORD dwDeb1 = GetTickCount();
for(int i = 0; i < NB_BCL; i++)
{
int val = rand();
floatVal = val/3.14159f;
intVal = (int) (float)floatVal;
}
DWORD dwFin1 = GetTickCount();
DWORD dwDeb2 = GetTickCount();
for(int j = 0; j < NB_BCL; j++)
{
int val = rand();
floatVal = val/3.14159f;
intVal = ftoi(floatVal);
}
DWORD dwFin2 = GetTickCount();
printf("%d\r\n", dwFin1-dwDeb1);
printf("%d\r\n", dwFin2-dwDeb2);
system("PAUSE");
return 0;
}
Conclusion :
résultat (celeron 800MHz):
conversion brute : 12s
avec ftoi : 6s
avec ftoi inline : 4s
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.