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 :

problème de pécision numérique


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 174
    Points : 38
    Points
    38
    Par défaut problème de pécision numérique
    Bonjour,

    Je développe actuellement un petit code de calcul "scientifique" qui nécessite d'effectuer des opérations du style Somme (i=1 à 50) (Exp(-lambda(j)) / [(lambda(i) -lambda(j))] avec des valeurs de Lambda(i) du style 3.7e-15.

    J'ai l'impression que dans certains cas j'ai des problèmes de précision numérique qui engendrent des résultats faux.

    Quelles sont les bonnes pratiques dans ce type de calcul ?

  2. #2
    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
    C'est tout à fait normal, le type Double ne gère que 15 digit après la virgule
    Si tu veux plus de précision, il faut utiliser des lib spécial pour calculs sur très grand entier ou flottant à grande précision genre BigInt, MatLab...
    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

  3. #3
    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
    Delphi utilise l'Extended par défaut, donc au mieux, tu peux utiliser l'extended (plus précis que double). Ou comme le dit Shay, des libs spécialisées.
    [ 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!

  4. #4
    Membre actif
    Avatar de fmdao
    Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 90
    Points : 210
    Points
    210
    Par défaut
    Peut-être revoir l'algorithme ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Citation Envoyé par aharel Voir le message
    Quelles sont les bonnes pratiques dans ce type de calcul ?
    Pour résumer ce qui a été dit :

    1) Utiliser le type Extended (19/20 chiffres significatifs) si les données n'ont pas besoin d'être portables sur d'autres plates-formes.
    2) Utiliser Int64 et revoir l'algorithme sur le principe de multiplier tous les coefficients avant les calculs, et de diviser le résultat (par une puissance de deux de préférence pour des raisons de performance), et en faisant attention aux débordements.
    3) Utiliser une librairie spécialisée. Mais il faut savoir que la bistromatique(calcul sur nombres infinis) provoque des temps de calcul très longs (car ça revient à faire des calculs avec des chaînes). Ce qui est rédhibitoire pour les calculs en temps réel.
    On peut cependant ne limiter l'utilisation de la bistromatique qu'à certaines parties stratégiques du calcul et, dans ce cas, coder ses propres routines (du sur mesure mais généralement pas réutilisable) .
    Un autre avantage de ce calcul sur des nombres infinis est qu'il évite les pièges du calcul en flottants, du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      A : Extended;
      B : Integer;
      ...
      B := 256;
      A := 255/B-1;
      Edit1.Text :=  FloatToStr(A); //Renvoie -0,00390625 !!!
    4) Enfin, en plus d'un programmeur, il y a toujours un mathématicien dans les équipes scientifiques (même en médecine, sociologie, etc...). Ce n'est pas un hasard.

  6. #6
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Citation Envoyé par Caribensila Voir le message
    Un autre avantage de ce calcul sur des nombres infinis est qu'il évite les pièges du calcul en flottants, du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      A : Extended;
      B : Integer;
      ...
      B := 256;
      A := 255/B-1;
      Edit1.Text :=  FloatToStr(A); //Renvoie -0,00390625 !!!
    C'est normal car c'est le bon résultat !
    Par contre A := 255/(B-1) a plus de chance de renvoyer 1 ....
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

  7. #7
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Oui. C'est vrai

    Alors un autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      var A,B: Double; 
       ...
        A := Power(2,60)+1;
        B := Power(2,60)  ;
        Edit1.Text := FloattoStr(A-B); // -> 0 !!!  
      end;

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Caribensila : Mais il faut savoir que la bistromatique(calcul sur nombres infinis) provoque des temps de calcul très longs (car ça revient à faire des calculs avec des chaînes). Ce qui est rédhibitoire pour les calculs en temps réel.
    A une époque j'avais crée une résolution d'équations de degré N avec des Extended qui me sortait de faux résultats dès que dépassais le degré 15 à cause du manque de précision.

    Puis un jour j'ai trouvé un cador (Rekin85) de l'ASM qui mettait au point une bibliothèque pour calculer avec des nombres géants mais entiers.
    Mais comme les nombres réels ne sont que des entiers sur lesquels on ajoute un point ou une virgule au bon endroit j'ai donc utilisé l'unité NewGCent de Rekin85 pour créer une unité qui l'utilise pour faire des calculs avec des nombres réels avec un nombre de chiffres significatif au choix.
    ... et ma résolution d'équations avec 50 chiffres significatifs n'est pas plombée par des temps d'exécution excessifs vu d'une part que l'unité NewGCent est en ASM et que d'autre part je tronque les strings-résultat au nombre de chiffres-significatifs souhaité en reportant les puissances de 10 dans un Int64.

    En plus de l'unité NewGCent (calculs avec des string codées en base 100) Rekin85 a également créé l'unité NewGint (calculs avec des string codées en base 256) également en ASM et plus rapide tant qu'on boucle sur des calculs sans affichage de résultats intermédiaires.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Puis un jour j'ai trouvé un cador de l'ASM qui mettait au point une bibliothèque pour calculer avec des nombres géants mais entiers.
    Excellente bibliothèque que je connais bien et qui d'ailleurs est téléchargeable sur un site concurrent.

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-salut,

    Caribensila : Excellente bibliothèque que je connais bien et qui d'ailleurs est téléchargeable sur un site concurrent
    ... Merci pour l'excellence.
    ... Par contre je ne pense pas qu'en matière d'entre-aide il y ait concurrence car tous les sites du même type vivent grâce également à tous ces bénévoles que nous sommes.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  11. #11
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Certes.
    Mais essayer de mettre en adéquation ses propres valeurs et le respect de la loi est un exercice difficile.

Discussions similaires

  1. Problème de précision numérique
    Par helico2 dans le forum C++/CLI
    Réponses: 3
    Dernier message: 24/09/2007, 18h30
  2. [SQL] Problème d'ordre numérique
    Par Seb981 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 24/07/2007, 11h22
  3. Problème de TextBox numérique
    Par Lutine dans le forum VB.NET
    Réponses: 25
    Dernier message: 23/07/2007, 13h28
  4. problème : texte ou numérique ?
    Par mouaa dans le forum VBA Access
    Réponses: 2
    Dernier message: 26/06/2007, 09h00
  5. Réponses: 2
    Dernier message: 25/08/2006, 19h49

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