Type real turbo pascal

jmc42 Messages postés 5 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 11 septembre 2012 - 5 janv. 2005 à 22:18
Sojojo Messages postés 41 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 7 septembre 2005 - 30 mai 2005 à 15:28
Bonjour,

Je dois reprendre, en visual basic .net, des fichiers(dont j'ai la description) créé avec une application turbo pascal. Je n'arrive pas à reprendre les données de type REAL. J'arrive bien à reconstituer la partie entière des chiffres mais pas la partie décimal.
Si quelqu'un peut m'aider .
Merci d'avance

4 réponses

cs_rico49 Messages postés 1 Date d'inscription jeudi 9 septembre 2004 Statut Membre Dernière intervention 30 janvier 2005 1
30 janv. 2005 à 23:38
Slt,

Le Real en pascal est codé de la manière suivante :

l'exposant (e)est sur 8 bits.

la mantisse (m) sur 39 bits.

le signe (s) sur 1 bit = 48 bits.



la formule pour retrouver ton nombre fottant est (-1)^s * 0,m * 2^e.



J'ai fait une fonction C++ qui convertit les real48 pascal en double C++. Ca devrait pas être trop dur à mettre en vb:



/******************************************************/

/* Substitutions.




*/

/******************************************************/

#define OFFSET_EXPOSANT 0x80

#define MASQUE_SIGNE 0x80

#define MASQUE_MANTISSE 0x7F

#define OFFSET_MANTISSE 0x80

#define DECALAGE_OCTET5 256 * 256 * 256 * 256

#define DECALAGE_OCTET4 256 * 256 * 256

#define DECALAGE_OCTET3 256 * 256

#define DECALAGE_OCTET2 256

#define TAILLE_REEL_PASCAL 6





/*********** code fonction *************************************/

FILE * pFichier = NULL;

CString szTemp = "";

int nCompteur = 0;

int nNbOctetsLus = 0;

BYTE tabTemp[6] = {0,0,0,0,0,0};

BYTE nSigne = 0;

double fMantisse = 0.0;

int nExposant = 0;

pFichier = fopen(nomFichier,"rb");

if(pFichier == NULL)

{

return FALSE;

}

else

{

rewind(pFichier); /* On se place au début du fichier binaire. */

/****************************************************************/

/* Lecture du fichier
binaire.

*/

/****************************************************************/

nNbOctetsLus = (int) fread(tabTemp,1,TAILLE_REEL_PASCAL,pFichier);

if(nNbOctetsLus != TAILLE_REEL_PASCAL)

{

fclose(pFichier);

break;

}

else

{

nExposant = tabTemp[0] - OFFSET_EXPOSANT;/* Exposant. */

nSigne =
tabTemp[5] & MASQUE_SIGNE; /* Signe.
*/

nSigne = nSigne >> 7;

fMantisse = tabTemp[5] & MASQUE_MANTISSE; /* Mantisse. */

fMantisse += OFFSET_MANTISSE;

fMantisse = fMantisse * DECALAGE_OCTET5;

fMantisse += tabTemp[4] * DECALAGE_OCTET4;

fMantisse += tabTemp[3] * DECALAGE_OCTET3;

fMantisse += tabTemp[2] * DECALAGE_OCTET2;

fMantisse += tabTemp[1];

/* Détection des
zéros.

*/

if((tabTemp[0] == 0)
&& (tabTemp[1] == 0) && (tabTemp[2] == 0) &&
(tabTemp[3] == 0) && (tabTemp[4] == 0) && (tabTemp[5]
0))

{

fMantisse = 0.0;

}

else

{

for(int i = 0; i < ((TAILLE_MANTISSE - nExposant) + 1) ; i ++)

{

fMantisse = fMantisse / 2;

}

}

/* Gestion du signe.


*/

if(nSigne 1) fMantisse - fMantisse; /* Nombre final */

}



@+
rico49
1
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
6 janv. 2005 à 09:25
Pour un Real en TP, je metterais un Double en VB.NET !


Christophe R
0
jmc42 Messages postés 5 Date d'inscription mercredi 17 septembre 2003 Statut Membre Dernière intervention 11 septembre 2012
6 janv. 2005 à 09:41
Merci pour la réponse,

Mais ça ne marche pas. Le real TP est codé sur 6 bits. Sur les fichiers que j'ai récupéré, j'ai repéré l'exposant sur le premier byte (représente le nombre de bits significatif de la partie entière) . Sur le dernier byte, le premier bit représente le signe.

Mais le reste ????
0
Sojojo Messages postés 41 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 7 septembre 2005
30 mai 2005 à 15:28
moi je suis en vb et j'ai le nombre flottant et j'aimerais faire l'inverse je sais pas si c possible
help me !!!!
0
Rejoignez-nous