decodage d'un nombre sur quatre octets (32 bits) au format ieee754 simple precision. La fonction retourne un float pour permettre une gestion plus simple ensuite. Evidemment cette routine est portable mais necessite plus de calculs que l'evidente bete copie des 4 octets a l'adresse d'une variable float qui elle n'est pas tout a fait portable suivant le type de processeur intel, motorola et autres.
Source / Exemple :
#include <stdio.h>
#include <math.h>
float tst3_cnv( long cnv_value )
{
long cnv_valuesign, cnv_vexp, cnv_vmantisse;
int cnv_vloop1;
float cnv_vfloat1;
cnv_vfloat1=1.0;
cnv_valuesign=1;
cnv_vexp=0;
cnv_vmantisse=0;
cnv_vloop1=0;
if( cnv_value & 0x80000000 )
{
cnv_valuesign=-1;
}
printf( "bitsign = %d\n", cnv_valuesign );
cnv_vexp=((cnv_value>>23)& 0xFF)-127;
/* printf( "exp = %d\n", cnv_vexp ); */
cnv_vloop1=23;
cnv_vmantisse=cnv_value & 0x007FFFFF;
do
{
if( cnv_vmantisse & 0x1 )
{
cnv_vfloat1+=pow(2,-(cnv_vloop1));
}
cnv_vmantisse>>=1;
cnv_vloop1--;
/* printf( "float1 = %f\n", tst3_vfloat1 ); */
}
while ( cnv_vloop1>0 );
cnv_vfloat1*=cnv_valuesign;
cnv_vfloat1*=pow( 2, cnv_vexp );
/* printf( "value in float = %f\n", tst3_vfloat1*pow(2,tst3_vexp)); */
return( cnv_vfloat1 );
}
int main( int argc, char *argv[] )
{
float value;
value = tst3_cnv( 0xBF800000 );
printf( "value = %f\n", value );
value = tst3_cnv( 0x40E3F34D );
printf( "value = %f\n", value );
value = tst3_cnv( 0xC2ED4000 );
printf( "value = %f\n", value );
return(0);
}
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.