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

Delphi Discussion :

Incompréhension de résultats sur le calcul : a/b/c


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Incompréhension de résultats sur le calcul : a/b/c
    Bonjour,

    En cherchant l'ordre de priorité de l'opération "a/b/c" avec "a, b, c : real", j'ai fait quelques tests et aucun ne me donne le même résultat :

    a := 2/5/4 donne 2,6368450273e-308
    b := (2/5)/4 donne 1,8072257318e-307
    c := 2/(5/4) donne 2,6362487395e-308

    d := 2.0/5.0/4.0 donne 2,7519127884e-307
    e := (2.0/5.0)/4.0 donne 1,5592512903e-307
    f := 2.0/(5.0/4.0) donne 6,5569702359e-312


    Dans le cas des entiers, il semblerait que le calcul se fasse de droite à gauche (et encore les 2 résultats ne sont pas identiques), alors que pour les réels il ne semble rien du tout, aucun des résultats ne se ressemble. Est-ce que quelqu'un pourrait m'expliquer pourquoi, ou à la rigueur me donner un lien vers une page l'expliquant ? (J'ai déjà fait une recherche sur le forum, qui m'a donné des informations intéressantes pour les calculs en Delphi, mais pas cette info).

    Autre question, pour calculer le quotient de 3 réels entre eux, les parenthèses sont-elles obligatoires sous peine d'avoir un résultat erroné (ou du moins, moins précis) ?

    J'utilise Delphi 2005 (Win32) sans aucun patch sous WinXP SP2

    Merci d'avance pour tout élément de réponse

  2. #2
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Une portion de code serait la bienvenue

    Car dans tous les cas, le résultat est erronée, et ce que tu affiches sont en fait des nombres très proches de 0, donc surement 0 en fait.

    la priorité est de gauche à droite
    Autrement dit, 2/5/4 est implicitement (2/5)/4 = 0.1 (très loin de 0!)

    et d'autre part, 2/(5/4) = 1.6 donc encore plus loin de 0...

    J'ai pas testé en Delphi, mais serais curieux de voir réellement ton code qui t'affiche ceci

  3. #3
    Membre habitué
    Inscrit en
    Avril 2005
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 123
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par TicTacToe
    Une portion de code serait la bienvenue

    Car dans tous les cas, le résultat est erronée, et ce que tu affiches sont en fait des nombres très proches de 0, donc surement 0 en fait.

    la priorité est de gauche à droite
    Autrement dit, 2/5/4 est implicitement (2/5)/4 = 0.1 (très loin de 0!)

    et d'autre part, 2/(5/4) = 1.6 donc encore plus loin de 0...

    J'ai pas testé en Delphi, mais serais curieux de voir réellement ton code qui t'affiche ceci

    Nexgen tu es sur de tes resultats?Voila ce que j'obtiens avec ce code:

    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
     
    procedure TForm1.FormCreate(Sender: TObject);
    VAR a,b,c,d:REAL;
    begin
        a:=2;
        b:=5;
        c:=4;
        d:=a/b/c;
        memo1.Lines.Add(format('%.10f',[d]));
        d:=a/(b/c);
        memo1.Lines.Add(format('%.10f',[d]));
        d:=(a/b)/c;
        memo1.Lines.Add(format('%.10f',[d]));
        a:=2.0;
        b:=5.0;
        c:=4.0;
        d:=a/b/c;
        memo1.Lines.Add(format('%.10f',[d]));
        d:=a/(b/c);
        memo1.Lines.Add(format('%.10f',[d]));
        d:=(a/b)/c;
        memo1.Lines.Add(format('%.10f',[d]));
    end;
    Dans le TMemo, j'ai :

    0,1000000000
    1,6000000000
    0,1000000000
    0,1000000000
    1,6000000000
    0,1000000000
    T'as pas un petit probleme avec ton CPU? (rechauffement, ou un truc du genre)

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut,

    Je viens également d'effectuer un test, et j'obtiens les mêmes résultats que Mayloshi, ce qui est normal !

    Donc l'incohérence de tes résultats est vraiment surprenante

    @+

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Voilà une portion de code l'utilisant, les résultats sont obtenus en plaçant un point d'arrêt sur la dernière instuction ("Edit.Text := ...") et en regardant les valeurs de a à e dans l'inspecteur de variables locales, ou bien en laissant le curseur sur la variable une fois qu'on a cliqué sur le fameux Button1.

    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
     
    procedure TfrmMainForm.Button1Click(Sender: TObject);
    var
      a, b, c : real;
      d, e, f : real;
      x, y, z : real;
    begin
      x := 2;
      y := 5;
      z := 4;
     
      a := x/y/z;
      b := (x/y)/z;
      c := x/(y/z);
     
      d := x/y/z;
      e := (x/y)/z;
      f := x/(y/z);
     
      edit1.Text := FloatTostr((2.0/5.0)/4.0); //Breakpoint ici
    end;
    Par contre, j'ai bien 0.1 qui s'affiche dans Edit1, donc je me demande d'où viennent ces valeurs étranges

  6. #6
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 291
    Points : 1 942
    Points
    1 942
    Par défaut
    Je crois que c'est du fait que ces variables ne sont pas utilisées par la suite, je viens de faire le test, avec les ShowMessage(FloatToStr(mes variables)) et là l'aperçu des valeurs est bon.

    Si tu décoches l'Option Optimisation dans les options du compilateur du projet, tu as les bons résultats.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Ah d'accord, c'est pour ça alors, merci bien pour l'info j'allais perdre confiance dans mon inspecteur de variables !

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

Discussions similaires

  1. trier sur le résultat d'un calcul dans l'état
    Par crissud dans le forum IHM
    Réponses: 21
    Dernier message: 16/03/2007, 07h04
  2. Réponses: 6
    Dernier message: 16/09/2005, 10h53
  3. [Formulaires] Résultat sur autres frames
    Par -DeN- dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 29/08/2005, 11h33
  4. Recherche sur champ calculé
    Par srvremi dans le forum Bases de données
    Réponses: 5
    Dernier message: 06/07/2004, 14h04

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