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

Free Pascal Discussion :

Conversion d'un programme Free Pascal Standard en programme Free Pascal Orienté Objet


Sujet :

Free Pascal

  1. #21
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 328
    Points : 4 145
    Points
    4 145
    Par défaut
    Bonsoir jacco,

    Xor était juste un clin d’œil à Andnotor (and not or, il manque xor).

    Citation Envoyé par jacco Voir le message
    Je ne suis pas familiarisé avec le langage C et donc je ne connaissais pas la syntaxe += .

    Juste une question, implicitement vous supposez que le couple d'instructions: while Depth1 > 0 do begin / dec(Depth1); est plus rapide que la seule instruction FOR I:=1 TO DEPTH DO ?
    Sinon je dois reconnaitre que rajouter * (1 + SSI5) a chaque itération n'était pas très performant (quelque fois on veut ecrire rapidement un code et on laisse de coté la performance ...)
    Si vous répondez par l'affimative a ma question j'implementerai votre solution surtout si je peux gagner 20% ...
    Bonne soirée
    La plupart des modifications sont plus d'ordre esthétiques et les goûts se discutent. Ainsi l'usage de la syntaxe += permet une concision rare en Pascal et illustre bien une opération d'accumulation.
    Les boucles qui se terminent à 0 sont plus "optimisables" que les boucles croissantes car les processeurs proposent des instructions spécifiques (comme Loop, Loopcc...) et les compilateurs les utilisent si on leur donne leur chance. Le gain reste cependant très faible. Par ailleurs j'économise une variable...
    En ce qui concerne les 20 % ce n'est hélas que sur la fonction améliorée mais c'est déjà cela.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  2. #22
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2020
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2020
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Bonjour Guesset,

    J'ai donc implementé vos recommendations, le code est effectivement plus concis. Question performance je dois probablement gagner quelque chose ne serait-ce que pour la suppression de * (1 + SSI5) à chaque itération.
    Par contre j'avoue n'avoir pas vu l'interêt des idées de Andnotor. Peut être y a t il quelque chose qui m'échappe ...

    Bien Cordialement

  3. #23
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2020
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2020
    Messages : 33
    Points : 15
    Points
    15
    Par défaut Comparaison/Test entre un Real et un element d'un tableau contenant des Reals
    Bonjour Guesset,

    Apres une absence un peu prolonge, je reviens vers vous avec un probleme d'execution.

    Je souhaite effectuer le test suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If    (NO_OF_STEP = 47 )   and  ( TCPH >  Var_TCPH_NBal[ 1 ]   )
    Var_TCPH_NBal[ 1 ] est un element d'un array contenant un Real (TCPH est egalement un Real) .
    A la compilation pas de probleme mais a l'execution ma routine n'evalue pas ou pas correctement ( TCPH > Var_TCPH_NBal[ 1 ] ).

    Que pouvez vous me suggerez.

    d'avance Merci pour votre aide

    Jacco

  4. #24
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 328
    Points : 4 145
    Points
    4 145
    Par défaut
    Bonjour,

    La petite portion de code ne semble pas en défaut.

    Il faut cependant faire attention dans la comparaison de réels notamment dans le cas de l'égalité mais je ne vois pas de problème de ce type ici quoiqu'il pourrait y avoir une égalité attendue qui se transforme en un >.

    Par exemple (sqrt(2)-1.0)*(sqrt(2)+1.0) sera rarement strictement = à 1.0 même si les affichages font l'arrondi qui semble que tout est OK. Il sera > ou <.

    En effet, sqrt(2) = 21/2 + e, e étant une erreur d'arrondi positive ou négative très petite en valeur absolue.

    Dans ce cas l'expression donne 1 + 2*21/2*e + e². L'erreur e est inférieure à la moitié du bit le plus faible donc e² est très en dehors de nos préoccupations de précisions. En revanche 2.8*e peut être supérieur (en absolu) au bit le plus faible. On dit que l'erreur est remontée. Je n'ai pas vérifié ce qu'il en est pour la racine de 2 dans les différentes représentations des réels mais l'exemple sert juste à illustrer le problème potentiel.

    Une portion de code un peu plus conséquente serait certainement utile. Par ailleurs, en quoi le résultat n'est pas celui attendu ?

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  5. #25
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2020
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2020
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Re-Bonjour Guesset et tout d'abord merci votre prompte réponse,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Var_TCPH_NBal, Var_CPDH_NBal : Array [ 1..100 ] of Real;
     
    R1, R2: Real;
    Le test complet se présente comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (NO_OF_STEP = 47 ) and ( TCPH > Var_TCPH_NBal[ 1 ] ) and    ( ((CPDH-1)*100) > Var_CPDH_NBal[ 1 ]    )      then  xyz
    Ce test est précédé et suivi par 400/500 inégalitées à peu pres du même type .
    Le code complet de mon Pgm fait 15000 lignes.

    Le point que je voudrais souligner est le suivant :
    si je remplace respectivement Var_TCPH_NBal[ 1 ] et Var_CPDH_NBal[ 1 ] par R1 et R2 (simple Variables de type Real) affectés du même contenu que Var_TCPH_NBal[ 1 ] et Var_CPDH_NBal[ 1 ] j'obtiens bien le résultat attendu.

    Le problème semble donc résider dans l'utilisation de Real éléments d'un array.

    J'espère que ces éléments supplémentaires vous aideront.

    Bien a vous

    Jacco

  6. #26
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Il serait préférable de passer par CompareValue en spécifiant un delta (unité Math) pour tester des réels.

  7. #27
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 328
    Points : 4 145
    Points
    4 145
    Par défaut
    Bonjour Jacco,

    Citation Envoyé par jacco Voir le message
    ...Le problème semble donc résider dans l'utilisation de Real éléments d'un array...
    Ce n'est pas possible. Si les contenus sont les mêmes, c'est à dire que les uns sont des affectations des autres et non le résultat d'au calcul qui devrait donner le même résultat, le fait d'être en tableau ne change rien.

    Attention : il ne faut pas supposer que l'affichage par défaut des valeurs prouve leur égalité car cet affichage a une précision donnée et pratique un arrondi.

    Si le tableau n'est pas une simple affectation de valeurs mais un calcul, il faut vérifier par une comparaison d'égalité genre if v = a[1] then OK else KO;.

    Il faut regarder si le tableau n'est pas modifié avant les tests soit volontairement soit accidentellement (par exemple au travers de pointeurs un peu hors jeu).

    La solution de Andnotor revient, dans le cas de cette comparaison, à remplacer TCPH > Var_TCPH_NBal[1] par TCPH - Var_TCPH_NBal[1] > delta pour gommer l'incertitude sur les derniers bits.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  8. #28
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2020
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2020
    Messages : 33
    Points : 15
    Points
    15
    Par défaut Comparaison/Test entre un Real et un element d'un tableau contenant des Reals
    Bonjour Guesset et merci pour le support

    Je vais reprendre mon code.

    et Merci a Andnotor pour sa suggestion (Comparevalue) que je vais tester.

    Tres bonne journee,

    Jacco

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/12/2009, 15h30
  2. Programmer en C Orienté Objet
    Par nicodn02 dans le forum C
    Réponses: 24
    Dernier message: 12/01/2008, 14h02
  3. passage de la programmation procédurale /O.Orienté objet
    Par bahhak dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 20/10/2007, 02h57
  4. Définitions de programmation impérative et orientée objet
    Par sjrd dans le forum Langages de programmation
    Réponses: 10
    Dernier message: 10/09/2005, 19h32

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