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 Delphi Discussion :

comparer 2 valeur de type double


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 27
    Points : 14
    Points
    14
    Par défaut comparer 2 valeur de type double
    Bonjour,
    J’ai une procédure qui permet de comparer deux valeurs de type double (val_plaf, mt)
    Mais le problème que ce code ne fonctionne pas même si la valeur de val_plaf est supérieure à la valeur de mt voila un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Procedure Tcalc_paie.calcul_plonche_plafe(val_plaf,mt,val_base,val_Plan : Double;val_FBR,val_NBR:String);
    begin
     
    val_plaf:=200;
    mt:=10;
     
    if (val_plaf > mt) then
    begin
    showmessage('test1')
    end
     
    end ;

    Je sais pas est ce que le problème de l’opérateur (>) et je dois le remplacer par une fonction ou quoi ? Merci d’avance

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 292
    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 292
    Points : 1 944
    Points
    1 944
    Par défaut
    L'exemple fonctionne bien chez moi (delphi 7). Je pense qu'il y a autre chose dans le reste du code.

    Tu peux utiliser CompareValue plutôt que l'opérateur >, mais bon cela sert plus pour des tests d'égalité.

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Est ce que tu appels bien ta procédure quelque part ?

  4. #4
    Membre à l'essai
    Inscrit en
    Septembre 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    merci pour votre réponse

    moi aussi je travaille avec delphi 7 la procedure c'est seulement un exemple mais la procedure réel

    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
    procedure Tcalc_paie.calcul_plonche_plafe(val_plaf,mt,val_base,val_Plan : Double;val_FBR,val_NBR:String);
     
    begin
     
     
    if val_plaf > 0 then begin
    if val_FBR = 'R' then  begin
    if val_plaf < mt then mt := val_plaf;
    end else begin
    if val_plaf < val_base then val_base := val_plaf;
    end;
    end;
    if val_Plan > 0 then begin
    if val_NBR = 'R' then
    begin
    if val_Plan > mt then
    begin
    mt := val_Plan;
    end
    end
    else
    begin
    if val_Plan > val_base then val_base := val_Plan;
    end;
    end;
     
     
    end;
    et voila l'appel de procedure


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    calcul_plonche_plafe(Plaf,MtAajouter,base,Plan,FBR,NBR)
    je pense que tous est bien mais j'ai rien compris

  5. #5
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    toujours bien ecrire et indenter son 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
    function MovIf(aIf: boolean; aThen: double; out aDest: double): boolean;{$IF RTLVersion >= 18.0}inline;{$IFEND}
    begin
      result := aIf;
      if aIf then
        aDest := aThen;
    end;
     
    procedure calcul_plonche_plafe(val_Plaf, val_Plan : Double; var mt, val_base: double; val_FBR, val_NBR: String);
    begin
      if val_FBR = 'R' then
        MovIf((val_Plaf > 0) and (val_Plaf < mt), val_Plaf, mt)
      else
        MovIf((val_Plaf > 0) and (val_Plaf < val_Base), val_Plaf, val_Base);
     
      if val_NBR = 'R' then
        MovIf((val_Plan > 0) and (val_Plan > mt), val_Plan, mt)
      else
        MovIf((val_Plan > 0) and (val_Plan > val_Base), val_Plan, val_Base);
    end;

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    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
     
    procedure Tcalc_paie.calcul_plonche_plafe(val_plaf,mt,val_base,val_Plan : Double;val_FBR,val_NBR:String);
    begin
     
      if val_plaf > 0 then 
      begin
        if val_FBR = 'R' then  
        begin
          if val_plaf < mt then mt := val_plaf;
        end 
        else
        begin
          if val_plaf < val_base then val_base := val_plaf;
       end;
      end;
     
      if val_Plan > 0 then  
      begin
        if val_NBR = 'R' then
        begin
          if val_Plan > mt then
          begin
            mt := val_Plan;
          end
        end 
        else
        begin
          if val_Plan > val_base then val_base := val_Plan;
        end;
      end;
     
     
    end;
    même bien indenté, ce code ne fait rien aucune valeur en retour !

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 665
    Points : 25 459
    Points
    25 459
    Par défaut
    Attention avec les réels, il est conseillé d'utiliser IsZero, SameValue, CompareValue, ... de l'unité Math, cela permet de gérer les erreurs d'arrondis en précisant le nombre de chiffre vraiement significatif

    Typiquement en compta, on gère un Epsilon de 0.01
    En compta internationale 0.0001 pour gérer les erreurs de taux de change
    Et Lors de la transformation via taux de change à 0.000001
    En finance, il y a même une gestion des "valeurs d'arrondies perdues", après tout, il n'y a pas de petit profit !

  8. #8
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function IsEqual(VA, VB: double): boolean;
    begin
      result := Pint64(@VA)^ = Pint64(@VB)^;
    end;
    comparaison binaire et c'est mare.

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 950
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 950
    Points : 5 667
    Points
    5 667
    Par défaut
    Meo,
    Citation Envoyé par Dr.Who Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function IsEqual(VA, VB: double): boolean;
    begin
      result := Pint64(@VA)^ = Pint64(@VB)^;
    end;
    comparaison binaire et c'est mare.
    Pas d'accord, tu retombes pile sur le problème de comparaison des réels, pour lesquels il faut accepter de petits écarts pour tester l'égalité.

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 665
    Points : 25 459
    Points
    25 459
    Par défaut
    Citation Envoyé par droggo Voir le message
    il faut accepter de petits écarts pour tester l'égalité.
    +1

    D'où l'utilisation des fonctions Delphi qui gère un Epsilon !

  11. #11
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par droggo Voir le message
    Meo,

    Pas d'accord, tu retombes pile sur le problème de comparaison des réels, pour lesquels il faut accepter de petits écarts pour tester l'égalité.
    un petit ecart de rien du tout et paf, on tombe à des millions d'années lumières de notre destination ...

    en même temps, c'etait juste pour plaisanter cette fonction ... j'espere que tu ne m'avais pas pris au serieux.

Discussions similaires

  1. [TinyXML] Accès aux valeurs (de type double)
    Par highlight dans le forum XML
    Réponses: 1
    Dernier message: 05/12/2011, 19h34
  2. Réponses: 10
    Dernier message: 01/02/2011, 09h02
  3. Réponses: 2
    Dernier message: 12/12/2009, 10h50
  4. Sortie des valeurs de type double
    Par otspot dans le forum C++
    Réponses: 2
    Dernier message: 29/06/2008, 20h26
  5. Réponses: 14
    Dernier message: 30/05/2008, 17h04

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