[gull] déserialiser une valeur double (ieee 754) avec be64toh

Daniel Cordey dc at mjt.ch
Mon Mar 5 10:38:51 CET 2012


On Fri, 2 Mar 2012 19:28:36 +0100 - François Bianco
<fbianco at swisslinux.org> wrote:

> Je me répond à moi même : oui c'est la représentation des nombres en
> float32 qui pose problème :
> 
> x = [1.01, 2.1, 0.03, 0.04, 0.05]
> y = array(x, dtype=float32)
> print(y)
> 
> array([ 1.00999999,  2.0999999 ,  0.03      ,  0.04      ,  0.05
> ], dtype=float32)

Effectivement...

values = values.astype(numpy.float64) / mult
values = values.round(decimals = self.multiplier)

--> [ -6.01  18.1    6.   ...,  -5.    15.    16.  ]

Fonctionne en effet tres bien. Si je rajoute, apres l'arrondi, la
ligne :

values = values.astype(numpy.float32)

--> [ -6.01000023  18.10000038   6. ...,   -5.   15.  -15.]

Le comportement non desire resurgit. Je me serai attendu a ce que
round(), me permette d'eliminer ces 'digits' a droite. Ce d'autant
qu'il ne semble pas s'agir du fameux probleme d'arrondi classique du
probleme '0.1', puisque je n'ai pas de '099999...'. Mais ce 2.7e-7 est
surprenant dans le sens ou il est a la frange de ce que float32 peut
manipuler, represent plus qu'un simple 'bit' errant suite a une
operation a la limite de l'over/under-flow et ne semble pas pouvoir
etre eliminer par round()... Il semblerait que Python 3.* traite les
problemes d'arrondis de maniere differente, mais je n'ai pas de version
de Numpy qui aille avec mon Python 3.2...

Bref... ca m'ennuie de manipuler des donnees en 64 bits (pour des
questions de memoire) alors que je n'ai absolument pas besoin de cette
precision :-(

Merci a tous pour vos infos et idees.

dc





More information about the gull mailing list