[RESOLU]Arrondi à partir d'une chaine de caractère

Arrondi à partir d'une chaine de caractère [RESOLU] - Python - Programmation

Marsh Posté le 31-08-2009 à 16:51:58    

Bonjour,
 
J'ai développé un script de traitement et analyse d'un fichier stl (fichier 3D d'un nuage de points) pour identifier des points de ce fichier de nuage de points (je ne suis pas opposé au fait de le poster mais il fait 250 lignes alors je le mettrai uniquement si on me le demande).
 
Mon problème : Le programme fonctionne bien à part qu'il réalise des arrondis au moment où il transforme les lignes de caractères "intéressants" en float. Je sais pourquoi Python fait cela (l'histoire du codage des réels en base 2) mais je ne vois pas comment le résoudre.
 
A noter : Les nombres doivent être utilisés pour des calculs avec une grande précision (et donc être formaté en réel sans perte de précision, or je ne sais faire que les arrondi de chaine avec "%.xf" %). Le nombre utilisé dans les essais ci-après est très représentatif (il est extrait du fichier stl).
 
Là où ca se complique :

  • je n'ai le droit d'utiliser que les modules de base de python 2.3 (ou 2.5)
  • les nombres comportent des exposants (voir essais ci-après)

Mes essais :

Code :
  1. >>> "%.11f" %float('1.939120e+003')
  2. '1939.12000000000'
  3. >>> eval("%.11f" %float('1.939120e+003'))
  4. 1939.1199999999999


 
Je ne sais pas quoi dire de plus, si ce n'est que j'espère qu'une solution existe et que quelqu'un aura la gentillesse de m'en faire part.
Merci d'avance et bonne journée,
 
Fred

Message cité 1 fois
Message édité par fraid49 le 02-09-2009 à 19:10:11
Reply

Marsh Posté le 31-08-2009 à 16:51:58   

Reply

Marsh Posté le 31-08-2009 à 17:03:17    

fraid49 a écrit :

Mon problème : Le programme fonctionne bien à part qu'il réalise des arrondis au moment où il transforme les lignes de caractères "intéressants" en float. Je sais pourquoi Python fait cela (l'histoire du codage des réels en base 2) mais je ne vois pas comment le résoudre.


En arrêtant d'utiliser des flottants

fraid49 a écrit :

A noter : Les nombres doivent être utilisés pour des calculs avec une grande précision (et donc être formaté en réel sans perte de précision, or je ne sais faire que les arrondi de chaine avec "%.xf" %). Le nombre utilisé dans les essais ci-après est très représentatif (il est extrait du fichier stl).


Tu ne peux pas "arrondir des flottants" quand la perte de précision est inhérente à la manière dont les flottants sont stockés.

 

Utilises le module decimal, il est beaucoup plus lent que le builtin float (parce qu'il n'utilise pas de floats/doubles hardware), mais il donne une précision illimitée (ou plus précisément une précision stricte et configurable, par défaut définie à 28 chiffres après la virgule).

Code :
  1. >>> from decimal import Decimal as d
  2. >>> d('1.939120e+003')
  3. Decimal('1939.120')
  4. >>> 0.1+0.1+0.1
  5. 0.30000000000000004
  6. >>> d('0.1') + d('0.1') + d('0.1')
  7. Decimal('0.3')
 

Si tu réussis à négocier l'utilisation de modules externes, numpy & scipy ont probablement des outils intéressants.


Message édité par masklinn le 31-08-2009 à 17:05:35

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 31-08-2009 à 20:59:33    

Merci pour cette réponse. J'ignorai qu'il s'agissait d'un module standard...
Bonne soirée,
 
Fred

Reply

Marsh Posté le 31-08-2009 à 21:04:20    

fraid49 a écrit :

Merci pour cette réponse. J'ignorai qu'il s'agissait d'un module standard...


Comme indiqué dans la documentation officielle du module il a été inclus à la stdlib dans Python 2.4.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 02-09-2009 à 19:06:36    

Bon, ben en fait, après moults essais, j'ai enfin réalisé que le problème ne vient pas de mon programme mais du fichier stl (généré par CATIA), dont la précision est trop mauvaise.
Je ne m'en suis rendu compte que tardivement car je réalisai mes vérifications sous CATIA avec le fichier CATIA et pas avec le fichier STL (qui aurait donc tenu de la dégradation de la précision).
Désolé d'avoir ouvert un post pour rien et merci à Masklinn pour les réponses...
Bonne soirée,
 
Fred

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed