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

C++ Discussion :

La somme des probas ne fait pas 1


Sujet :

C++

  1. #1
    Membre éclairé Avatar de adilou1981
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Par défaut La somme des probas ne fait pas 1
    Bonjour,

    Mon problème est que avec c++ la somme des probas est diferente de 1.

    voici des exemples :

    0 , 0 , 0 , la somme est0 ,

    //c'est la ou ca louche il me donne une somme 1 alors qu il afiche d autres nombres au lieu de 0.
    1 , 7.9245e-008 , 3.36624e-007 , la somme est1 ,

    0.333333 , 0.333333 , 0.333333 , la somme est1 ,
    0.333333 , 0.333333 , 0.333333 , la somme est1 ,
    0.790927 , 0.201588 , 0.00748495 , la somme est1 ,
    0.333333 , 0.333333 , 0.333333 , la somme est1 ,
    0.333333 , 0.333333 , 0.333333 , la somme est1 ,
    0.333333 , 0.333333 , 0.333333 , la somme est1 ,
    0.333333 , 0.333333 , 0.333333 , la somme est1 ,
    0.333333 , 0.333333 , 0.333333 , la somme est1 ,
    0.333333 , 0.333333 , 0.333333 , la somme est1 ,
    0.333333 , 0.333333 , 0.333333 , la somme est1 ,
    0.333333 , 0.333333 , 0.333333 , la somme est1 ,


    Quand j ai cherché sur les forums , j ai trouvé que c est un pb de precision du calcul avce les flottant , que j utilise float ou double la somme n est pas tjr precise. cad si j ai 0,33333333+0,33333333, il afiche 0,66666667 . si on fais 1-0,1 10 fois successive on ne tombe pas sur 0 comme prévu mais sur qqc de proche.

    il me faut une partie de code pr corriger mes resultats de facon a prendre en considération cette imprecision due au calcul des flottant.

    j espere que j ai bien decrit le pb. ca na pas de rapport avec mon code mais avec les possibilités du langage et de l ordinateur. je sai vraiement pas cmt faire

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonjour,
    Je pense que tu devrai forcer le formatage de tes nombres avec beaucoup plus de chiffre après la virgule, pour évaluer les erreur réels, car je soupçonne 0,66666667 d'être une erreur d'arrondi lié au formatage, plutôt qu'une erreur de double.
    Après si l'imprécision reste trop grande, j'ai peur qu'il n'y ai pas solution toute faite a ce problème. Tu peu aller voir sur ce lien (merci Mongaulois ):
    http://cpp.developpez.com/faq/cpp/?p...ions_flottants
    En espérant que tu y trouvera ton bonheur.

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 964
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 964
    Par défaut
    Hia,

    Comme tu l'as déjà trouvé, c'est inhérent à la représentation des nombres réels.

    Tu peux gagner en précision en passant de float à double, et encore gagner en utilisant une librairie multi-précision (GMP, par exemple), mais il y aura toujours une limite, vu que quelque soit l'intervalle que tu veux utiliser (en dehors d'un ensemble vide, et d'un ensemble ne contenant qu'un élément, bien entendu), il contient une infinité de nombres réels.

    Et l'infini n'est pas représentable sur nos machines...

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 453
    Par défaut
    Citation Envoyé par adilou1981 Voir le message
    il me faut une partie de code pr corriger mes resultats de facon a prendre en considération cette imprecision due au calcul des flottant.

    j espere que j ai bien decrit le pb. ca na pas de rapport avec mon code mais avec les possibilités du langage et de l ordinateur. je sai vraiement pas cmt faire
    Malheureusement, prendre en compte ce genre de chose fait partie du métier. L'algorithme le plus « propre » d'un point de vue purement mathématique n'est pas toujours le meilleur sur le plan technique, spécialement parce que le premier fait complètement abstraction de la manière dont le calcul doit être mené.

    Même en utilisant des nombres à virgule flottante dont la taille est très grande - voire elle-même flottante - tu ne pourras jamais coder 1/3, par exemple, sans imprécision.

    Ça veut dire que ton code doit être conçu pour faire le maximum de calcul symbolique lui-même, comme tu le ferais sur papier, et reporter à la dernière étape la détermination effective des valeurs.

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par adilou1981 Voir le message
    Mon problème est que avec c++ la somme des probas est diferente de 1.
    Bienvenu dans le monde fantastique des mathématiques appliquées. Ce que tu demandes n'est pas possible avec une représentation finie des nombres comme celle qui est présente dans tous les langages (impossible de représenter pi, e, ...)

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Le phénomène où les approximations s'accumulent s'appelle l'instabilité numérique.
    Mais là, en fait, tu n'accumules rien. C'est juste que 1-epsilon et 1 c'est la même chose en flottant.

  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Maintenant, voici 2 solutions... qui valent ce qu'elles valent.

    - Tu additionnes les probas et tu calcules la différence entre 1 et ces probas... Si c'est inférieur à un certain epsilon (10^(-N)), tu fais comme si c'était 1...

    - Tu crées une classe pour encapsuler tes probas sous forme p/q (rationnel), en espérant pour toi que tu calcules tes probas grâce à des formules du type nombre_de_cas_favorable/nombre_de_cas_possibles et que les autres s'en déduisent avec des calculs qui permettent de garder ce type de calculs.

  8. #8
    Membre éclairé Avatar de adilou1981
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Par défaut
    merci tous pour vos réponses , je vais essayer d'appliquer ce que vous me proposez même cela parait flou d'un premier abord, y en a qui me propose une librairie d'autre un epsilon.

  9. #9
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Une bibliothèque te permettrait d'aller très très très loin dans les décimales, ce qui te rapprocherait de l'idéal.
    L'epsilon te permettrait lui d'arrondir un peu les angles, de faire en sorte que ça tourne à peu près rond ! Ceci n'est pas absolument pas en contradiction avec la solution de la bibliothèque !
    Enfin, les rationnels permettrait de calculer de manière exacte (puisqu'on n'a pas de représentation décimale) mais ça serait un chouilla plus lent.

  10. #10
    Membre éclairé Avatar de adilou1981
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Par défaut
    on ma proposé la bibliothèque GMP y en a d'autres?

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 964
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 964
    Par défaut
    Mae,

    D'un autre côté, utiliser des double te donne environ 16 chiffres significatifs.

    As-tu réellement besoin de mieux que ça ?

    Tu n'auras jamais de calcul exact si tu utilises des réels, quelle que soit la précision utilisée, car tu finiras toujours par atteindre la limite selon tes valeurs.

    Il faut accepter les petits écarts dus à la représentation limitée des réels, sinon, on n'a plus qu'à tous jeter nos ordis, sauf à ne plus utiliser de calculs avec des réels.

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 453
    Par défaut
    Citation Envoyé par droggo Voir le message
    Mae, D'un autre côté, utiliser des double te donne environ 16 chiffres significatifs. As-tu réellement besoin de mieux que ça ?
    Le problème est que les erreurs peuvent se cumuler, spécialement dans le cas de boucles, ce qui est fréquent en proba/stats. Si on considère que le dernier bit de chaque double est imprécis et que l'on fait 80 multiplications successives, alors le flou gagne peu à peu tous les bits de la mantisse ...

  13. #13
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par adilou1981 Voir le message
    on ma proposé la bibliothèque GMP y en a d'autres?
    Ca ne résoudra pas tes problèmes, comme je l'ai dit. Tu dois d'abord apprendre à faire de l'analyse numérique.

  14. #14
    Membre chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par défaut
    Plutôt que d'utiliser des double, pourquoi ne pas sommer des entiers et vérifier que la somme vaut bien le nombre de tests ?
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  15. #15
    Membre éclairé Avatar de adilou1981
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Par défaut
    Citation Envoyé par Florian Goo Voir le message
    Plutôt que d'utiliser des double, pourquoi ne pas sommer des entiers et vérifier que la somme vaut bien le nombre de tests ?
    Merci d'expliquer d'avantage

  16. #16
    Membre chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par défaut
    Un exemple, sachant que je ne sais pas sur quoi portent tes probas :

    Tu traites les résultats d'un sondage sur la couleur préférée des gens. Mettons que 480 personnes ont répondu au sondage :
    - Bleu : 209 personnes, soit 0,435416667
    - Rouge : 98 personnes, soit 0,204166667
    - Vert : 63 personnes, soit 0,13125
    - Autre : 110 personnes, soit 0,229166667

    Au lieu de faire :
    0,435416667 + 0,204166667 + 0,13125 + 0,229166667 = 1,000000001
    Tu fais :
    209 + 98 + 63 + 110 = 480
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  17. #17
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 964
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 964
    Par défaut
    Hao,
    Citation Envoyé par Obsidian Voir le message
    Le problème est que les erreurs peuvent se cumuler, spécialement dans le cas de boucles, ce qui est fréquent en proba/stats. Si on considère que le dernier bit de chaque double est imprécis et que l'on fait 80 multiplications successives, alors le flou gagne peu à peu tous les bits de la mantisse ...
    Alors, la seule solution est d'utiliser des entiers (en gérant des rationnels, par exemple), ou des réels de précision infinie ().

    Il faut bien faire la part des choses à un moment ou un autre. Le problème de la représentation des réels est irréductible, tout ce qu'on peut faire est de reculer la limite, et ça coûte rapidement du temps de calcul.

  18. #18
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Travailler avec des rationnels ça marche que si tu ne manipules que des polynomes.
    Si tu fais un cos/sin ou un log/exp, tu ne peux pas avoir de valeur exacte.

  19. #19
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 964
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 964
    Par défaut
    Hao,
    Citation Envoyé par loufoque Voir le message
    Travailler avec des rationnels ça marche que si tu ne manipules que des polynomes.
    Si tu fais un cos/sin ou un log/exp, tu ne peux pas avoir de valeur exacte.
    Ben oui, quand je dis que le problème des réels est irréductible ...

  20. #20
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Calcul formel, ya que ça de vrai !

Discussions similaires

  1. l'enregistrement des données ne se fait pas?
    Par karimala dans le forum Bases de données
    Réponses: 4
    Dernier message: 16/01/2011, 08h18
  2. [Débutant] Calcul des formules ne se fait pas
    Par Mister Paul dans le forum Excel
    Réponses: 3
    Dernier message: 14/12/2010, 18h00
  3. [AC-2003] Somme 2 sous etats si un des 2 ne contient pas de données
    Par jilow dans le forum IHM
    Réponses: 6
    Dernier message: 16/11/2009, 21h13

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