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 :

Opérateur relationnel ne marche pas


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Opérateur relationnel ne marche pas
    Bonjour à tous,

    je viens vous voir pour un gros au secours, j'ai des noeuds au cerveau.

    voici le programme pas très long

    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
    unit Unit1;
     
    interface
     
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
      var essai:real;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    essai:=essai-0.025;
    button1.caption:=floattostr(essai);
    if essai<118 then form1.Caption:='oui' else form1.Caption:='non';
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    essai:=118.1;
    end;
    quand je clique sur mon bouton, voici les valeur affichées
    118.075/non
    118.05/non
    118.025/non
    et le pire
    118/oui alors que l'opérateur est stricte===> le problème est donc ici!
    117.975/oui

    Je suis obligé de faire ceci pour que cela marche
    essai:=essai-0.02;
    essai:=essai-0.005;

    et donc j'aurai bien
    118.075/non
    118.05/non
    118.025/non
    118/non
    117.75/oui

    J'ai essayer le code sur delphi 7 et Delphi 8XE même problème

    A votre bon coeur et vous remercie d'avance

  2. #2
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Bonjour,

    remplace le type Real par Currency et ça roule
    je me rappelle plus pourquoi ... si je retrouve la discussion sur le sujet je donnerais le lien ici
    ou si quelqu'un d'autre a l'explication

    Edit:
    pour visualiser le problème utilise le type Single et tu verras les décalages occasionnés

    pour l'explication voir par ici

    Cordialement,
    @+

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,

    oui, je pense que c'est un problème lié à la représentation des nombres réels. Il faut utiliser un "Epsilon" pour la comparaison.

    Regarde la FAQ qui traite du cas de la comparaison de 2 nombres réels :

    Comparer 2 Réels


    A+
    Charly

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Pour compléter ma réponse :

    pour comparer 2 réels (ou mieux Double), au lieu de

    if (Essai < 118) ...

    tu dois faire :

    // Uses Math

    If ((118 - Essai)<Min(Abs(Essai),118)*1E-12) ...

    A+
    Charly

  5. #5
    Membre averti

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Points : 332
    Points
    332
    Par défaut
    bonjour

    Pour comparer 2 nombres réels il faut calculer l'erreur relative : Abs( A - B) / B

    et définir l'erreur admissible, exemple 1/100 ou moins si nécessaire.

    PL

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    System.Math.Comparevalues ne feraient pas le job plus facilement ??

  7. #7
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Oui, CompareValue(Essai, 118) fait bien l'affaire avec la valeur de Epsilon à 0 par défaut, mais qui est remplacée par la valeur qui va bien en fonction des arguments single, double ou extended. (1E-12 pour les doubles comme dans mon post précédent)

    Peut être que la valeur 118 sera considérée comme un extended dans compareValue ?

    A+
    Charly

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    function CompareValue(const A, B: Extended; Epsilon: Extended): TValueRelationship;
    function CompareValue(const A, B: Double; Epsilon: Double): TValueRelationship;
    function CompareValue(const A, B: Single; Epsilon: Single): TValueRelationship;
    function CompareValue(const A, B: Integer): TValueRelationship;
    function CompareValue(const A, B: Int64): TValueRelationship;
    function CompareValue(const A, B: UInt64): TValueRelationship;
    Les paramètres sont du type que l'on passe.

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    bonjour à tous, merci pour toutes ces réponses, je vais les essayer dès mon retour à la maison.

    Cela étant je comprend le problème de comparaison sur un nombre exposant 165, mais là j'avoue ébété sur un problème avec un chiffre au dixième.

    Je vais essayer la méthode sans l'epsilon, en effet je suis sur un projet de simulateur de vol a320 en delphi 7 et en suis déjà à 70000 lignes, alors vous imaginez l'optimisation déjà que j'ai besoin du cpu dans des choses plus importantes.

    Je vous rassure, je passerai un jours en Delphi C++

    Encore merci et vous tiens au courant

  10. #10
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,
    le mieux est d'utiliser CompareValue.
    Par contre, je ne vois pas trop l'intérêt de substituer C++ à Pascal ? Pour les appli en temps réel, ADA avait bonne réputation ?

    A+
    Charly

  11. #11
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    re,

    Ok pour CompareValue mais compte tenu de ceci:
    Citation Envoyé par airbus Voir le message
    ...
    Je vais essayer la méthode sans l'epsilon, en effet je suis sur un projet de simulateur de vol a320 en delphi 7 et en suis déjà à 70000 lignes, alors vous imaginez l'optimisation déjà que j'ai besoin du cpu dans des choses plus importantes.

    ...
    je me demande si il n'est pas préférable d'utiliser le type Currency ce qui permet de faire une comparaison simple dans le code ( if a > B then ...)
    à la place de passer par une fonction externe au code avec tout ce que ça implique en charge CPU supplémentaire (CompareValue appel SameValue ...) et c'est sans compter le décalage par manque de précision sur arrondi, selon le type choisi, qui pourrait poser des problèmes au bout d'un certain nombre de calcule !!!

    Le type Currency semble justement éviter tout ça
    Enfin c'est juste une réflexion ... vous en pensez quoi ?

    Cordialement,
    @+

  12. #12
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Oui, avec plus de 50 chiffres significatif, le Epsilon doit être "très epsilon" !!

    Mais l'inconvénient du currency est ne n'avoir que 4 décimales. Cela dépend donc de la précision que l'on souhaite pour A et B.

  13. #13
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    ok
    mais a précision équivalente (Epsilon = 0.0001)

    après un rapide teste pour chiffrer l'impacte de ces fonctions, ça donne:
    qu'une simple comparaison est 7 fois plus rapide qu'un appel à SameValue
    et 11 fois plus rapide qu'un appel à CompareValue !

    Donc si la précision lui suffit (il n'y a que 3 décimales dans son exemple) le teste est sans appel

    Cordialement,
    @+

  14. #14
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    effectivement, tout depend des calculs et des valeurs souhaitées.
    0.001 * 0.001 = 0.000001, et on dépasse les Currency, alors qu'en réel la valeur sera assez précise, vu que tu as 1 chiffre significatif, un double sera entre 0.99999999999999999999 et 0.000000000000000000011

  15. #15
    Futur Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous, voici quelques nouvelles.

    En effet pour ce qui était de ma question currency va suffir (fréquence avion) par contre dans d'autres parties je passerai par ValueCompare (mécanique du vol...)

    En tout les cas merci pour vos post


    Pour Charly910, je passerai en C++ car la partie 3D avec opengl, est bien mais n'est pas à la hauteur du projet. J'ai conscience qu'il va falloir bosser au niveau mémoire dur-dur. Imaginez 10000 dalles voire plus (HeightField) sur opengl...cela étant pour le moment je fait la 3D minimaliste sur un thread.

    Pour le moment delphi est un vrai plaisir!

    Je ne sait pas si on a le droit de mettre une lien mais voici le projet:http://airbusa320.esy.es/Accueil.html

    Bien à vous

  16. #16
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Pas de problème pour mettre le lien vers le projet. Et quel projet !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  17. #17
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Citation Envoyé par airbus Voir le message
    Bonjour à tous, voici quelques nouvelles.
    Ben ma belle, félicitations !

    J'ai tout regardé du lien que tu as donné, fouhhh !, quel boulot ça a dû être ! Mais quel résultat

    Juste un mot, un truc qui m'a titillé, dans ma spécialité :
    De nuit s'affichera les étoiles réelles du ciel nocturne
    s'afficheront ! Hé oui, ce sont les étoiles qui s'afficheront.

    Encore bravo
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  18. #18
    Futur Membre du Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Bonsoir,

    merci pour,la correction de francais, vous avez devant vous le résultat de la méthode globale en français. Correction pour prochaine mise à jour.cdlt

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

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