14/03/2009, 21:59:08
Le compte est bon ;-)
Si tu pars de 43 1C 82 8F
1 bit de signe: valeur = 0 (nombre positif)
8 bit d'exposant: valeur = 134 (0x43 décalé d'un bit vers la gauche)
23 bit de mantisse: valeur = 1868431 (1C 82 8F en hexa)
L'exposant représente une valeur décalée de 2^(x-1) - 1 (x représente
le nombre de bits de l'exposant)
Dans notre cas (exposant sur 8bit) c'est décalé de 127 donc l'exposant
réel est 134-127 = 7
La mantisse représente un nombre compris entre 1 et 2, il faut donc
diviser notre nombre par la valeur maximale de la mantisse (23 bits =>
valeur maximale = 2^23) pour la ramener entre 0 et 1. Ensuite ajouter
1 pour l'avoir entre 1 et 2.
Donc la mantisse vaut 1+(1868431 / (2^23)) = 1.22273433
1.22273433 * 2^7 = 156.509994
Formule complète:
(1+(1868431 / (2^23))) * 2^(134-(2^(8-1)-1)) = 156.509995
Pas vraiment évidente, la conversion...
Dans linknx, j'ai réglé le problème de la manière la plus simple qui
soit. Je stocke les bytes dans un entier 32bit puis je cast en float.
Et comme par définitien ce type KNX correspond au format IEEE 754 qui
est celui utilisé par le type float en C, ça marche comme un charme.
Pour plus d'info sur tous les types KNX, il existe un document
librement disponible sur leur site (pour une fois que quelque chose
concernant le standard KNX est librement disponible, ça vaut le coup
de le signaler):
http://www.knx.org/fileadmin/downloads/0...3%20AS.zip
A+
Jean-François
On 14 mar, 18:41, Marc Assin <raym...@warichet.com> wrote:
> On 14 mar, 13:19, Gilles ARNAUD <lifedo...@live.fr> wrote:> Normalement un EIS5, float 32 bits avec virgule...
>
> Ah ?!?
> D'après ma doc (Konnex, July 2004 PAGE 3/24)
> EIS5 "2-octet Float Value"
Si tu pars de 43 1C 82 8F
1 bit de signe: valeur = 0 (nombre positif)
8 bit d'exposant: valeur = 134 (0x43 décalé d'un bit vers la gauche)
23 bit de mantisse: valeur = 1868431 (1C 82 8F en hexa)
L'exposant représente une valeur décalée de 2^(x-1) - 1 (x représente
le nombre de bits de l'exposant)
Dans notre cas (exposant sur 8bit) c'est décalé de 127 donc l'exposant
réel est 134-127 = 7
La mantisse représente un nombre compris entre 1 et 2, il faut donc
diviser notre nombre par la valeur maximale de la mantisse (23 bits =>
valeur maximale = 2^23) pour la ramener entre 0 et 1. Ensuite ajouter
1 pour l'avoir entre 1 et 2.
Donc la mantisse vaut 1+(1868431 / (2^23)) = 1.22273433
1.22273433 * 2^7 = 156.509994
Formule complète:
(1+(1868431 / (2^23))) * 2^(134-(2^(8-1)-1)) = 156.509995
Pas vraiment évidente, la conversion...
Dans linknx, j'ai réglé le problème de la manière la plus simple qui
soit. Je stocke les bytes dans un entier 32bit puis je cast en float.
Et comme par définitien ce type KNX correspond au format IEEE 754 qui
est celui utilisé par le type float en C, ça marche comme un charme.
Pour plus d'info sur tous les types KNX, il existe un document
librement disponible sur leur site (pour une fois que quelque chose
concernant le standard KNX est librement disponible, ça vaut le coup
de le signaler):
http://www.knx.org/fileadmin/downloads/0...3%20AS.zip
A+
Jean-François
On 14 mar, 18:41, Marc Assin <raym...@warichet.com> wrote:
> On 14 mar, 13:19, Gilles ARNAUD <lifedo...@live.fr> wrote:> Normalement un EIS5, float 32 bits avec virgule...
>
> Ah ?!?
> D'après ma doc (Konnex, July 2004 PAGE 3/24)
> EIS5 "2-octet Float Value"