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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de adilou1981
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 44
    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 : 45
    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 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    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 : 44
    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 : 44
    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?

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