Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1418 connectés 

  FORUM HardWare.fr
  Programmation
  Python

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1919986
fraid49
Posté le 31-08-2009 à 16:51:58  profilanswer
 

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
mood
Publicité
Posté le 31-08-2009 à 16:51:58  profilanswer
 

n°1919991
masklinn
í dag viðrar vel til loftárása
Posté le 31-08-2009 à 17:03:17  profilanswer
 

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
n°1920057
fraid49
Posté le 31-08-2009 à 20:59:33  profilanswer
 

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

n°1920060
masklinn
í dag viðrar vel til loftárása
Posté le 31-08-2009 à 21:04:20  profilanswer
 

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
n°1920721
fraid49
Posté le 02-09-2009 à 19:06:36  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

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

 

Sujets relatifs
[résolu][Velocity & Hudson] Templates non copiés dans le classpath[PHP] Comparaison de chaine d'un fichier
Generer aleatoirement un caractère à partir d'un tableauSDL_GetRGB (résolu)
[Résolu] Génération flux RSS - Format de dateVBA :Garder les arrondi avec les pourcentages
[Résolu] [BATCH] Tracer la commande delete[Algo][Résolu]Générer tous les accords.
sendAndLoad pas de retour sous flash {résolu} 
Plus de sujets relatifs à : [RESOLU]Arrondi à partir d'une chaine de caractère


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR