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 288
    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 288
    Points : 1 936
    Points
    1 936
    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é.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  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 ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  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;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  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 : 54
    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 445
    Points
    28 445
    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 !
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    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 !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  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.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    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é.
    Si les cons volaient, il ferait nuit à midi.

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    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 !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  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.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

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