Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Lecture d'un nombre à virgule flottante

4 réponses
Avatar
Pierre Archambault
Bonsoir, ou bonjour selon le cas...

Je suis à la recherche d'une explication. Je lis d'un fichier une valeur
"Single", donc 4 bytes.

Cette chaîne de caractères représente un nombre de la façon suivante:
Chaque caractère a une valeur Ascii et cette valeur peut être transposée en
8 bits (Binaire)
Si l'on concatène les 8 bits représentant chacun des 4 caractères de la
valeur "Single ", nous obtenons une chaîne de 32 bits.

Le premier bit représente le signe (0 : Positif, 1: Négatif)

Les 8 bits suivants permettent de trouver l'exposant en soustrayant la
valeur de ces 8 bits de 127.
Exemple: 127 - 81 (01010001) = 46 (exposant)

Les 23 bits qui restent sont la mantisse.

J'ai trouvé une formule sur Internet qui devrait permettre de retrouver mon
nombre de départ mais je n'y arrive pas. Voici la formule:

s: signe (0 ou 1)
e: exposant
m: mantisse

(-1)^s * m * 2^(e-127)

Elle est peut-être erronnée ou alors je ne la comprends pas bien.

Quelqu'un peut-il m'aider à comprendre le principe ?

Merci de votre aide.

Pierre

4 réponses

Avatar
jm
"Pierre Archambault" wrote in message
news:lv%eh.5161$
Bonsoir, ou bonjour selon le cas...



Hello,

Je suis à la recherche d'une explication. Je lis d'un fichier une valeur
"Single", donc 4 bytes.
J'ai trouvé une formule sur Internet qui devrait permettre de retrouver
mon nombre de départ mais je n'y arrive pas. Voici la formule:



<snip>

s: signe (0 ou 1)
e: exposant
m: mantisse

(-1)^s * m * 2^(e-127)
Elle est peut-être erronnée ou alors je ne la comprends pas bien.



Elle est correcte...

Quelqu'un peut-il m'aider à comprendre le principe ?



C'est du masochisme, mais bon allons-y ...

Well, pour bien comprendre, il faut savoir 2 choses:

a) On est sous Windows, dans une architecture Intel donc Little Endian
=> Les LSB sont en tête

b) Dans la norme utilisée (IEE754), la ruse c'est que la mantisse
représentée est sur 23 bits, mais la mantisse réelle est sur 24, car
on suppose la présence d'un bit (dit "bit implicite" à 1 (à la fin)).

Prenons le code suivant:
n = 1
f = FreeFile
Open "c:test.dat" For Binary As #f
Put #f, , n
Close #f

Editons notre fichier test.dat avec un éditeur hexa, on trouve:
00 00 80 3F

Maintenant, comme nous sommes en little endian, la valeur réelle est:
3F 80 00 00

En binaire, ça nous donne:
00111111100000000000000000000000
Si on redécoupe selon le format 1|8|23, on obtient
0 01111111 00000000000000000000000

Soit:
S = 0
E = 7F (127)
M = 0 (mais avec le bit implicite, M = 1)

on a bien Valeur = (-1)^0 * 1 * 2^(127-127) = 1 * 1 * 1 = 1
CQFD.

Même exercice avec n=3.5

le fichier test.dat va contenir:
00 00 60 40 <==> 40 60 00 00

soit en binaire
01000000011000000000000000000000

et après découpage
S = 0 = 0
E = 10000000 = 0x80 = 128
et pour M, on prend les 23 bits, à l'envers:
11000000000000000000000 <=> 00000000000000000000011
et on ajoute le bit 1 (implicite) => 000000000000000000000111
000000000000000000000111 = 0x0007 = 7

Donc

v = (-1)^0 * 7 * 2^(127-128) = 1 * 7 * 2^(-1) = 1 * 7 *0.5 = 3.5

CQFD.

Si tu es arrivé jusqu'ici sans mal de tête, un simple mot: BRAVO!


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
jm
"jm" wrote in message
news:457d616f$0$31457$
"Pierre Archambault" wrote in message
news:lv%eh.5161$
Bonsoir, ou bonjour selon le cas...






Hello,

Ne pas tenir compte de mon message précédent, ce que
j'ai raconté est faux!

J'ai refait les calculs de mémoire mais je me suis
tout à fait trompé :-((

Le décodage de la mantisse ne se fait pas comme j'ai dit.

Pour le cas n=3,5 par exemple, il faut bien sur lire:

V = 1 * 1,75 * 2^(128-127) = 3,5

Voir à ce sujet:
http://babbage.cs.qc.edu/IEEE-754/Decimal.html
et ceci:
http://www.commentcamarche.com/base/representation.php3

désolé d'avoir poster trop vite!

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Pierre Archambault
Salut Jean-Marc,

Je te remercie pour ces précisions. C'est clair et maintenant je comprends.

Si jamais tu as besoin d'information sur VBA Excel... je ne prétends pas
être un expert mais j'ai quelques années de codage derrière moi.

Encore une fois, merci

Pierre


"jm" a écrit dans le message de news:
457d79a9$0$1131$
"jm" wrote in message
news:457d616f$0$31457$
"Pierre Archambault" wrote in message
news:lv%eh.5161$
Bonsoir, ou bonjour selon le cas...






Hello,

Ne pas tenir compte de mon message précédent, ce que
j'ai raconté est faux!

J'ai refait les calculs de mémoire mais je me suis
tout à fait trompé :-((

Le décodage de la mantisse ne se fait pas comme j'ai dit.

Pour le cas n=3,5 par exemple, il faut bien sur lire:

V = 1 * 1,75 * 2^(128-127) = 3,5

Voir à ce sujet:
http://babbage.cs.qc.edu/IEEE-754/Decimal.html
et ceci:
http://www.commentcamarche.com/base/representation.php3

désolé d'avoir poster trop vite!

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/




Avatar
Jean-marc
"Pierre Archambault" a écrit dans le
message de news: WIgfh.29220$
Salut Jean-Marc,

Je te remercie pour ces précisions. C'est clair et maintenant je
comprends.

Si jamais tu as besoin d'information sur VBA Excel... je ne prétends pas
être un expert mais j'ai quelques années de codage derrière moi.

Encore une fois, merci




Hello,

C'est avec plaisir :-)

Et promis, je ne manquerais pas de faire appel à toi si
j'ai des questions VBA Excel!

Bonne soirée,

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/