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 :

Différence bizarre d'un calcul avec variables intermédiares


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut Différence bizarre d'un calcul avec variables intermédiares
    Bonjour,
    J' ai un phénomène très bizarre que j'explique pas, à vous de juger.

    On a deux objets, Foo et Bar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Foo
    {
      double getX()
      {
        return (m_X);
      }
      double getY()
      {
        return (m_Y);
      }
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Bar
    {
      double getValue()
      {
        return (m_value);
      }
    };
    Maintenant, ce qu'il y a de bizarre, c'est qu'en faisait cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    result = (Foo.getX() - Bar.getValue()/2 + Foo.getY()/2)/Foo.getX();
    // result = 0.17271511157289223814537137968728
    Et cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double x = Foo.getX();
    double value = Bar.getValue();
    double y =  Foo.getY();
    result = (x - value/2 + y/2)/x;
    // result = 0.17271511157289287652361053915229
    On obtient pas le même resultat comme vous pouvez le voir.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // result = 0.17271511157289223814537137968728
    // result = 0.17271511157289287652361053915229
    Je ne comprends vraiment pas car les getters() ne font que renvoyer la valeurs et rien de plus.
    Si quelqu'un à une explication, je suis preneur.

    Merci de votre aide.

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Est-ce que les variables membre m_x, m_y et m_value sont de type double?

  3. #3
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Oui, désolé de ne pas avoir précisé cela.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Foo
    {
      double getX()
      {
        return (m_X);
      }
      double getY()
      {
        return (m_Y);
      }
    private:
      double m_X;
      double m_Y;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Bar
    {
      double getValue()
      {
        return (m_value);
      }
    private:
      double m_value;
    };

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    double

    Tout est dit.

    Tu es, toi aussi, victime de l'approximation flottante.

    Certaines corrections anti-erreurs sont applicables sur le cas des variables locales, ce qui n'est pas forcément le cas avec les appels de fonctions.
    Ou le contraire

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    C'est tout de même bizarre. Je viens de faire le test avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    struct Foo
    {
    	Foo(double x, double y) : m_X(x), m_Y(y) {}
     
    	double getX()
    	{
    		return (m_X);
    	}
     
    	double getY()
    	{
    		return (m_Y);
    	}
     
    	double m_X, m_Y;
    };
     
    struct Bar
    {
    	Bar(double value) : m_value(value) {}
     
    	double getValue()
    	{
    		return (m_value);
    	}
     
    	double m_value;
    };
     
    int main(int argc, char* argv[])
    {
    	Foo foo(2.3, 3.2);
    	Bar bar(5.4);
    	double result1 = (foo.getX() - bar.getValue()/2 + foo.getY()/2)/foo.getX();
     
    	double x = foo.getX();
    	double value = bar.getValue();
    	double y =  foo.getY();
    	double result2 = (x - value/2 + y/2)/x;
     
    	getchar();
    	return 0;
    }
    et dans mon test, result1 et result2 sont exactement égaux, avec une visualisation à 17 chiffres après la virgule (je ne sais pas comment en voir plus). Windows 7, visual c++ 2010.

  6. #6
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Je connais le problème de l'approximation flottante (due à la manière de representer les flottants) mais là j'ai du mal à accepter la différence de resultat.

    Si je t'avais dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    double x = 3.0;
    if((1./3.)==(1./x))
    {
     //
    }
    else
    {
     // approximation flottante
    }
    // La OK, je comprends
    Mais là tu es entrain de me dire que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double x = getX();
    if(x != getX())
    {
      // tout est normal: approximation flottante
    }

  7. #7
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    r0d:
    Essaye une fois avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x = 343.41000000000002501110429875552654;
    y =  23.70134488207620293565014435444027;
    value = 33.92;
    S'il te plait.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réaliser un calcul avec variable
    Par remi2305 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 12/03/2015, 10h16
  2. [2.x] [twig] Déclaration et calcul avec variables
    Par jejeman dans le forum Symfony
    Réponses: 3
    Dernier message: 30/01/2014, 12h27
  3. [CR XI] Calcul avec variable partagée
    Par sat478 dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 18/09/2010, 16h14
  4. Réponses: 3
    Dernier message: 16/07/2008, 16h28
  5. Formule de calcul avec variable ?
    Par clarisse dans le forum Excel
    Réponses: 5
    Dernier message: 19/09/2007, 14h27

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