begin process at 2012 05 27 15:26:28
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > DECODAGE IEEE754

DECODAGE IEEE754


 Description

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

  • #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);
  • }
#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);	
}



 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

[DEV-C++] CALCUL DE LA RACINE CARRÉE D'UN RÉEL par Jhep
Source avec Zip CODE DECODE BASE64 (WIN32) par BruNews
Source avec Zip Source avec une capture COMPARAISON C ET SSE2/3 (WIN32) par BruNews
Source avec Zip FLOAT EN HEXA (WIN32, ASM) par BruNews

Commentaires et avis

Commentaire de omnia le 05/01/2008 10:50:20

Salut,

Pour ce genre de source il aurait été plus judicieux de la mettre dans les snippets.

bon codage :)

Commentaire de verdy_p le 08/01/2008 04:27:17

Portable? Hmmm... pas si évident car la fonction utilise pow() pas forcément définie (et qui devra de toute façon aussi réaliser les mêmes opérations pour convertir l'exposant en flottant valide, en tenant compte des décimales possibles de l'exposant).

Il manque aussi le support des NaN et valeurs infinies (aucune vérification sur la valeur de l'exposant lu par simple masquage binaire, alors que la valeur minimale de l'exposant, quand on le convertit en entier signé, indique ces valeurs spéciales, et dans ce cas la mantisse s'interprète différemment et peut contenir aussi des valeurs "dénormales" proches de zéro mais avec une précision réduite).

Enfin la routine ne gère pas non plus le "moins zéro" (défini dans la norme IEEE754 pour conserver le signe de l'inverse d'une valeur infinie afin de prolonger certains calculs en maintenant une précision sur le signe sans invalider nécessairement l'utilisation de la valeur obtenue comme argument d'une autre fonction).

Sinon l'interprétation de la mantisse bit par bit dans une boucle est une méthode particulièrement inefficace! On peut utiliser la mantisse directement sans faire appel à cette boucle, en jouant sur la valeur de l'exposant de base 2.

Enfin il existe une fonction pour calculer une puissance entière de 2, nettement plus efficace que pow(), bien que pow() l'utilise aussi (en combinaison avec les fonctions d'extraction de partie entière et partie fractionnaire)! Et toutes les biliothèques de calcul IEE754 supportent une fonction de conversion entre une représentation binaire entière et la valeur flottante associée (ou l'inverse).

La prochaine version de la norme gérera en plus des flottants simple et double précision (codés sur 32 ou 64 bits) des flottants en précision fixe, et des flottants codés en décimal (BCD, mais une aussi amélioration encore plus compacte du BCD) pour les calculs financiers ou à précision décimale imposée, ainsi qu'un format encore plus long sur 128 bits.

La finalisation de cette version est en cours, la nouvelle version de la norme (dont le texte pratiquement finalisé est disponible, on sait déjà quels formats standards il y aura, et les primitives de calcul seront aussi étendues) est déjà devrait sortir cette année, en principe au printemps.

On devrait en disposer alors dans toutes les plateformes assez vite (Les versions beta sont déjà disponibles pour Windows, MacOSX, Linux, BSD... et avec différents compilateurs de différents fournisseurs, et pour de nombreux langages, pas seulement le C, mais aussi des versions optimisées pour de nombreux processeurs, et les prochaines versions de processeurs supporteront nativement ces formats flottants et un certain nombre de primitives standards; les travaux actuels sont surtout destinés à évaluer les performances et produire une certification de la précision des calculs obtenus avec des outils de tests très précis, car la norme sera encore plus exigeante en terme de précision).

Commentaire de selligattangip le 08/01/2008 22:50:39

merci pour toutes ces precisions. Je ne savais pas que pow n'etait pas portable, cette fonction ne me plait pas non plus surtout dans des calculs mettant en jeu des puissances de 2... Mais j'avais cherché une methode plus portable que ma premiere solution de copier les 4 octets recupérés dans un trame modbus dans un float et je n'avais bizarrement pas trouvé d'exemples en C sur le net, donc j'ai pensé que ça pouvait aider à trouver des methodes plus optimisées... Et j'aimerais connaitre quelle est la fonction qui permet de calculer une puissance entiere de 2

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Conversion d un float [ par Seth ] Comment arrondir un float vers le nombre le plus proche.Exemple : (float)2.8 -&gt; 3 ! (float)2.3 -&gt; 2 Demande source en C conversion IEEE754 AU SECOUR!!!!!! [ par Benny54 ] Si vous avez quoi que ce soit sur la conversion IEEE754 en langage C envoyez le moi je suis au bord du GOUFFRE!!!!! [C++] precision [ par kikiops ] comment faire pour avoir des resultats float avec deux decimalesj'vous donne un ch'tit exemple , ca sera plus simple pour m'faire comprendrefloat a = Conversion de donnée [ par Johjo ] Salut tout le monde, je cherche à convertir une valeur char en valeur float et inversement de float en char. L'equivalent de Val et Str en basic.Merci Convertir une chaine de caractere en Float [ par Johjo ] Bon, voilà, j'ai encore un probleme.Je dois maintenant convertir un chaine de caractere en float, et je ne trouve pas de fonctions, j'ai regardé dans dépassement capacité d'un float et int [ par golum ] result=scanf("%f",&coef); if (result !=0 && coef !=0)Voila si j'entre un nombre délirant style 9999999999999999999999999999999999999999999999999999999 Conversion Float to String [ par PierreP ] Bonjour à tous !je suis en train de me prendre la tête pour créer une fonction de conversion d'un réel en une chaine de caractère (problème du débutan arrondir un chiffre [ par JosueClement ] en admettant que j'ai une variable de type float:float var = 6.98466;je voudrais pouvoir arrondir le chiffre. par exemple 6.98 !Merci d'avanceJosué Cl C'est quoi float !!!? [ par ATH|500| ] Je voudrais savoir à quoi sert la commande:floatExemple: float j; équation et tableaux [ par cabarrus ] je ne trouve pas l'erreur dans mon programme?#include&lt;stdio.h&gt;#include&lt;conio.h&gt;int deltanul(int);float deltainf(float);float deltasup(floa


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,811 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales