IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Opérations arithmétiques sur du texte


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut Opérations arithmétiques sur du texte
    Salut,

    Je cherche un moyen simple et efficace de faire des opérations d'addition/soustraction sur des nombres décimaux représentés sous forme de texte.

    Par exemple "10.2" + "0.4" = "10.6"

    Merci

    Quelques explications pour le contexte de cette demande :

    Je manipule des données stockées au format texte que je représente en "double" et parfois je dois les comparer exactement entre elles. Le problème c'est que j'ai des effets de bord liés au fait que pour certains nombres l'égalité suivante est fausse atof("10.2") + atof("0.4") == atof("10.6").

    Il y a bien sûr la possibilité de faire le test à epsilon près mais il se trouve que ça alourdit énormément mes calculs de comparaison qui sont extrêmement nombreux, en revanche la quantité de nombres résultats d'une opération d'addition/soustraction est beaucoup plus restreinte. Donc je préfère garder un test exact et m'assurer que je manipule toujours des nombres exactement les mêmes que la conversion de leur équivalent texte.

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    A part en refaisant "à la main" les opérations sur les chaînes comme on le fait sur papier (=> en gros, créer une classe dont la chaîne est l'attribut, et surcharger les opérateurs), je ne vois pas.

    Ceci étant dit, ça ne va pas forcément être simple, même si ce n'est pas non plus très compliqué.

    J'explique : il faut trouver la position du séparateur décimal, donc le "." (attention aux conventions locales si jamais tu y es soumis).
    Ensuite, il faut normaliser la chaîne, avec par exemple systématiquement 10 chiffres après la virgule, et 10 chiffres devant. Ainsi, chaque nombre sera stocké sur un nombre constant de caractères, avec la virgule toujours au même endroit.
    Ensuite, pour l'addition par exemple : tu pars du dernier caractère pour les deux termes, tu additionnes en ENTIERS (=> exact), tu propages la retenue sur l'opération de gauche et tu continues jusqu'à avoir fait chaque rang.

    Après, ça marche, et ça sera sans aucune perte de précision... Par contre, j'ai bien peur que ça ne te coûte horriblement cher côté temps CPU et place mémoire !!

    Après, si tu es ouvert aux suggestions, je te conseillerais de t'orienter vers des nombres en virgule fixe, qui garderont la précision dont tu as besoin. Tu peux trouver une librairie ici, par exemple, mais il en existe sûrement beaucoup d'autres.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Merci,

    L'idée des nombres à virgule fixe semble intéressante. Par contre je ne vois pas par quel biais je peux être sûr qu'on a toujours :

    Si aa.a + bb.b = cc.c alors
    Fixed(atof("aa.a")) = Fixed(atof("bb.b")) + Fixed(cc.c)

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    En fait je viens de penser à une autre possibilité dont je n'ai pas encore la solution :

    Il me suffit étant donné un nombre dont j'ai la représentation en virgule flottante de trouver le nombre à virgule flottante le plus proche qui soit une conversion d'un nombre sous forme texte avec un nombre maximum connu de chiffres après la virgule.

    Ainsi je fais tranquillement mes opération sur les flottants et le résultat je l'arrondis au plus proche flottant qui représente une conversion "valide".

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Heu, non, tu as fait une confusion : en virgule fixe, tu passes directement de la chaîne au nombre en VF, SANS PASSER PAR DES FLOTTANTS. Sinon, tu en perds tout le bénéfice !!
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Heu, non, tu as fait une confusion : en virgule fixe, tu passes directement de la chaîne au nombre en VF, SANS PASSER PAR DES FLOTTANTS. Sinon, tu en perds tout le bénéfice !!
    Ah ben ça c'est problématique car j'ai quand même besoin de faire des calculs avec la précision des flottants...

    Je crois que je vais continuer dans mon idée d'arrondir au plus proche flottant valide.

Discussions similaires

  1. Opérations arithmétiques sur les Listes
    Par yoshik dans le forum Général Python
    Réponses: 33
    Dernier message: 17/06/2009, 18h39
  2. Réponses: 3
    Dernier message: 29/03/2009, 22h40
  3. Opérations arithmétiques sur les caractères
    Par JolyLoic dans le forum C
    Réponses: 6
    Dernier message: 18/01/2009, 21h59
  4. Opérations arithmétiques sur matrices creuses
    Par fdl1508 dans le forum Pascal
    Réponses: 3
    Dernier message: 25/12/2007, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo