Conversion float -> int

Contenu du snippet

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

A voir également

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.