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 :

Delphi et le calcul numérique


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut Delphi et le calcul numérique
    Contexte : Delphi XE7/Windows Seven


    Bonjour,

    Mon message est relatif à la thématique « gestion des nombres flottants » dans Delphi.

    Il se trouve que lors de l’évaluation du code ci-dessous (visiblement assez simple) pour des valeurs « extrêmes » j’obtiens, sur des machines différentes, des comportements différents.


    Les machines ont pour nom « SCU58594 » et « scu58576 » les installations Delphi sont (la seule différence est une licence pro pour la première et entreprise pour la seconde) :

    Nom : machines.png
Affichages : 491
Taille : 34,2 Ko

    En mode debug sur les deux machines/installations Delphi après l’exécution des deux instructions ci-dessus j’obtiens les points de suivi suivants (l’option d’optimisation
    est décochée dans les deux cas) :


    Nom : Calculs.png
Affichages : 452
Taille : 41,3 Ko

    Les impacts de ces deux comportements différents sont assez important puisque dans le premier cas, la boucle dans laquelle sont ces deux instructions termine alors qu’elle est
    infinie dans le deuxième.

    Alors, il est certain que la division par (Htfin-HtInit) devrait être interdite si cette différence est très petite, mais je suis quand même surpris d’un comportement différent,
    avec un impact important pour des installations somme toutes similaires.

    Je suis preneur de références solides et reconnues relatives au bon conditionnement des calculs numériques en Delphi. Je sais qu’en ADA les concepteurs avaient apporté un
    très grand soin aux problèmes numériques (en introduisant des types « fixes » et « flottants ») certains s’en sont peut-être inspirés sur des travaux Delphi ?


    Le débat est lancé..

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    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 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Même processeur sur les deux machines ? (voir ici)
    Delphi 5 Pro - Delphi 10.4 Rio 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 !

  3. #3
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut
    Comme indiqué dans mon premier poste la fréquence n'est pas exactement la même. A cet égard il faut que je me penche plus avant sur l'article propose qui semble assez édifiant !

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    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 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Comment sont initialisées les valeurs de départ ?
    Se pourrait-il qu'une petite différence de conversion, éventuellement liée à un paramètre local (TFormatSettings), aboutisse à une divergence ?
    Sinon, possibilité de tester avec IsInfinite() (si on aboutit à un tel résultat, d'ailleurs, sans exception, c'est qu'on ne divise pas par zéro, a priori !)
    Delphi 5 Pro - Delphi 10.4 Rio 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 !

  5. #5
    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
    Les 2 postes ont bien la même valuer du 8087CW à ce moment ?

  6. #6
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut
    Suivi de variables supplémentaires pour les deux postes

    SCU58594

    Nom : SCU58594_more.jpg
Affichages : 363
Taille : 57,6 Ko

    SCU58576

    Nom : scu58576_more.jpg
Affichages : 399
Taille : 50,9 Ko

    On constate que le "IsInfinite" ne donne pas le même résultat.

    Le Defaut8087CW.

    Le FormatSettings est également le même sur les deux postes.

    Complément sur les deux postes :

    chaque poste est doté de quatre processeurs (identiques sur les deux machines) :

    Nom : Processeur_identique.png
Affichages : 312
Taille : 5,1 Ko

    la version de l'OS est également la même

    Nom : système_identique.png
Affichages : 476
Taille : 3,3 Ko

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    salut

    meme option de compilation ... il n'y aurais pas une optimisation qui traine par là ?
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut
    Non sur les deux postes le test est fait avec du code compilé sans optimisation

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Yop !
    Citation Envoyé par Négrier Voir le message
    la version de l'OS est également la même

    Nom : système_identique.png
Affichages : 476
Taille : 3,3 Ko
    Ça ne suffit pas, ça : depuis le SP1 il y a eu plein de mises à jour, qu'on ne voit pas, là... Et si par hasard une (des) mise(s) à jour ne sont pas passées sur l'un des postes alors que c'est passé sur l'autre ?

    Faudrait vérifier les version de kernel32.dll et d'autres du même tonneau.

    Tout ça dit avec un gros, un énorme "peut-être"...
    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

  10. #10
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut
    J'ai regardé de près les dates de mise à jour : elles sont identiques de même que les versions de "kernel32.dll" pour les deux machines

  11. #11
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    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 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Pas de différence sur la cible de compilation (Win32/Win64) ?
    Delphi 5 Pro - Delphi 10.4 Rio 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 !

  12. #12
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut
    Non tout est compilé en 32 bits.
    Par ailleurs, lorsque je compile avec l'option d'optimisation (pour les deux machines) j'ai la même différence.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Allez, encore une manip :
    prendre le programme compilé sur la machine A et le faire tourner sur la machine B (et réciproquement) : le problème suit le programme ou pas ?
    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

  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
    Citation Envoyé par Jipété Voir le message
    le problème suit le programme ou pas ?
    Les paris sont ouverts ... moi je vote pour un problème de machine, pas de compilation.
    J'avais eu un problème il y a quelques années mais avec 2 proc différents (un Pentium4 et je sais plus quoi)
    Pourrait tu nous donner le type de tes variables ?
    Tu peux aussi essayer d'afficher la précision max de tes variables dans les points de suivi, avec HtFin,f20.
    Dernière chose, faire un programme console contenant juste la partie incriminée en forçant les valeurs qui te posent problème, et en sortant la valeur sans passer par l'évaluateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    HtFin := 9715.3506439355;
    HtInit := 9715.3506439355;
    b := (VzFin - VzInit) / (HtFin - HtInit);
    Writeln(b);

  15. #15
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut
    En traçant sur fichier les valeurs impliquées dans les calculs (ce que je dois faire pour passer les exécutables d'un poste à l'autre, et donc ne plus utiliser les debuggers de chaque installation),
    on peut constater que HtFin et HtInit ne sont pas strictement identiques (les deux codes ne sont pas strictement identiques si ce n'est cette portion qui provoque des comportements
    différents puisque justement les valeurs sont en effet différentes)

    Nom : croisementCompiloPosteRuntime.png
Affichages : 319
Taille : 9,0 Ko

    Pour en revenir au début de la discussion ce qui m'intéresse est de savoir comment la "communauté des développeurs de calcul scientifique en Delphi" gèrent leurs traitements ou conditionnent les
    grandeurs flottantes manipulées de telle sorte qu'une valeur de 1e-12 soit considérée comme égale à zéro (ce qu'elle est en fin de compte dans mon exemple).

    Les variables flottantes utilisées dans le code montré dans cette discussion sont des doubles.

    Dans mon dernier test (pour faire le quadruple test compilateurs/machines) j'ai même essayé d'affecter HtFin et HtInit dans des variables "Extended" mais là encore
    il n'y a pas de différence visible entre les valeurs des deux variables alors que HtFin-HtInit vaut 1e-12 dans l'un des codes et 0 dans l'autre

  16. #16
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut
    L'addition est-elle associative ?

    ce petit exemple Excel montre que sur les ordinateurs ça n'est pas toujours le cas

    Feuille Excel avec les valeurs

    Nom : valeurs.png
Affichages : 304
Taille : 1,7 Ko

    Feuille Excel avec les formules

    Nom : formules.png
Affichages : 310
Taille : 2,5 Ko

    donc (X+Y-X)/Y n'est pas toujours égal à (X-X+Y)/Y !

    Même sur un exemple aussi simple (c'est sur qu'une telle différence entre les ordres de grandeurs n'est pas si fréquente) il faut se méfier du calcul numérique sur ordinateur !

  17. #17
    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
    Il faut bien prendre en compte le nombre de chiffres significatifs. Pour un double, c'est 15-16.
    Donc X+Y-X = (X+Y)-X
    X+Y = X car 1000000000 + 0.00000001 = 1000000000.00000001 : on dépasse les 16 chiffres significatifs donc le 1e-8 ne sera pas pris en compte.
    Par contre, X-X+Y = (X-X)+Y
    X-X = 0; 0+Y = Y car 0 + 0.00000001 = 0.00000001, on reste dans le domaine de précision du double.

    Ce qui est intéressant dans ton message précédent, c'est qu'on voit que c'est la compilation qui change le comportement, et non pas la machine.
    Je n'ai pas XE7, mais en D7 il y a des directives qui modifient le comportement des réels : $REALCOMPATIBILITY, peut etre que sur XE7 il y en a d'autres qui ont un impact dans ton cas !

  18. #18
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut
    L'article : http://www.nccs.nasa.gov/images/Floa...onsistency.pdf
    auquel j'ai accédé depuis la référence fournie par "tourlourou" (deuxième post du fil de discussion)
    fait référence à un switch "fp-model" pour les compilateurs Fortran/C/C++ qui est fortement recommandé pour les applications travaillant
    avec des nombres en virgule flottante. Je ne sais pas si il existe le concept équivalent pour le compilateur Delphi (je n'ai rien trouvé dans les
    options du compilateur accessibles depuis l'IDE).

    Nom : fp-switch.png
Affichages : 301
Taille : 15,1 Ko

  19. #19
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    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 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Il est sage d'utiliser dans certains cas CompareValue pour évaluer la proximité vis-à-vis d'un seuil.

    Dans ton exemple, la boucle serait interrompue par un tel test de proximité entre les 2 valeurs à soustraire, au seuil que tu aurais choisi (au besoin dépendant de la valeur du numérateur).
    Delphi 5 Pro - Delphi 10.4 Rio 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 !

  20. #20
    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
    Cesses de nous faire languir comme ca ...
    D’où vient la source que tu compiles ? Est-ce exactement la même entre les 2 machines (fichiers source, options du projet, ...)
    Peux tu essayer de copier le dossier du projet de la machine 1 vers la machine 2 et le compiler pour être sûr de l'identicité du contenu

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Les bibliothèques de mathématiques et de calcul numérique
    Par ToTo13 dans le forum Mathématiques
    Réponses: 16
    Dernier message: 14/08/2013, 12h13
  2. [fedora 9,eclipse CDT,Qt] utiliser GMP (calculs numériques)
    Par olivier57b dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 23/09/2008, 15h53
  3. Réponses: 1
    Dernier message: 14/08/2008, 16h38
  4. calcul numérique : Intégrateur simplectique d'ordre 2
    Par TocTocKiéLà? dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 11/06/2006, 22h34
  5. [Delphi 6] EditBox -> valeurs numériques ?
    Par JBrek dans le forum Composants VCL
    Réponses: 9
    Dernier message: 02/12/2002, 14h08

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