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 :

Operation virgule flottante incorrecte.


Sujet :

Langage Delphi

  1. #1
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    749
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 749
    Points : 500
    Points
    500
    Par défaut Operation virgule flottante incorrecte.
    bonjour a tous.

    Tous est dans le titre !!

    Le programme sur lequel je travaille, me retourne ce défaut "aléatoirement" sans que j'arrive vraiment a déterminer ou !! car tout les fonctions utilisées dans la partie du programme qui génèrent ce défaut, son fréquemment utilisés ailleurs et sans problèmes.

    j'ai tout de même trouvé une piste qui me semble complétement incohérente.

    si le résultat d'un calcul est hors gamme la routine de calcul me renvoie 1E99. si nous passons cette valeur de 1E99 à 1E15 l'erreur ne semble plus de produire !! qu'en pensez vous ??

    merci de votre avis

  2. #2
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 374
    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 374
    Points : 3 152
    Points
    3 152
    Par défaut
    Bonjour,

    il faudrait que tu donnes un peu plus de détail sur le type de calcul, les variables utilisées ... Est ce un calcul simple ou long et complexe à décrire ?

    que veux tu dire par "hors gamme" - le résultat prévisible dépasse le domaine de définition de la variable dans lequel tu le stockes ?

    @+

    Charly

  3. #3
    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
    Salut,
    Citation Envoyé par petitcoucou31 Voir le message
    si le résultat d'un calcul est hors gamme la routine de calcul me renvoie 1E99. si nous passons cette valeur de 1E99 à 1E15 l'erreur ne semble plus de produire !! qu'en pensez vous ??
    1E99, c'est bien supérieur au nombre de particules dans l'Univers ( ~ 1E80) !
    En revanche, 1E15 est dans l'étendue de Extended...
    Ceci explique sans doute cela.

    Cela vient peut-être d'une fonction qui renvoie +infini.
    Essaie IsInfinite de l'unité Math.


    PS : Et si tu bosses dans une banque, surtout attends la fin du G20 !

  4. #4
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    749
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 749
    Points : 500
    Points
    500
    Par défaut
    Salut a vous deux ,

    Pour répondre a : Charly910

    le calcul effectué est le résultat d'une mesure physique qui est exécuté dans une DLL qui renvoie soit le résultat du calcul soit "1E99".
    L'envoie de la valeur 1E99 est juste pour indiquer que le résultat du calcul est hors gamme pour la mesure en cours (x > a la valeur max admise).
    Cette DLL est utilisée par ailleurs et fonctionne sans soucis et sans ce plantage.

    D ou ma recherche de ce problème pas dans le calcul , mais dans le traitement de ce calcul (en fait un affichage et la progression d'une bargraph). Le résultat se trouve bien dans l’étendue de la variable est est un réel.


    Pour répondre a :Caribensila

    Comme quoi l'informatique et le nombre d'atome de l'univers ...lol

    Real 5.0 x 10^-324 .. 1.7 x 10^308
    Extended 3.6 x 10^-4951 .. 1.1 x 10^4932


    je cherche toujours !

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Pourquoi ne pas utiliser la valeur dédiée à l'absence de résultat NaN et IsNan
    Ou encore Infinity et IsInfinite

    Je n'ai pas Delphi, mais sous C++ les types équivalent fonctionnent avec 1E99 !
    Il y a confusion entre la précision 15 pour un Double et la valeur de l'exposant, 1E99 ou 1E15 sont tout à fait valable en Double !

    le Real \ Real48 est a proscrire !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      Single S99 = 1E99; // float
      Double D99 = 1E99; // double
      Extended E99 = 1E99; // long double
      MemoTrace->Lines->Add(Format("Single: %f - Double: %f | %e - Extended : %f | %e", OpenArray<TVarRec>(S99, D99, D99, E99, E99), 4));
      MemoTrace->Lines->Add(Format("Single: %f - Double: %f | %e - Extended : %f | %e", OpenArray<TVarRec>(++S99, ++D99, D99, ++E99, E99), 4));
      MemoTrace->Lines->Add(Format("Single: %f - Double: %f | %e - Extended : %f | %e", OpenArray<TVarRec>(--S99, --D99, D99, --E99, E99), 4));
      MemoTrace->Lines->Add(Format("Single: %f - Double: %f | %e - Extended : %f | %e", OpenArray<TVarRec>(--S99, --D99, D99, --E99, E99), 4));
    Single passe en Infinity
    Double et Extended s'affiche 9,99999999999999967E98 ou 1,00000000000000E+099 selon %f ou %e
    Attention à cela si il y a des conversions en chaine et vice-versa !

    Je penche plutôt pour une erreur d'arrondi et que le teste sur 1E99 ne se passe pas correctement laissant la suite du code provoquer une erreur

Discussions similaires

  1. Erreur : Opération en virgule flottante incorrecte
    Par [ZiP] dans le forum Langage
    Réponses: 4
    Dernier message: 04/10/2009, 22h47
  2. erreur operation virgule flottante
    Par looping dans le forum Langage
    Réponses: 2
    Dernier message: 19/12/2008, 13h57
  3. valeur virgule flottante incorrecte
    Par pram dans le forum XMLRAD
    Réponses: 12
    Dernier message: 16/11/2005, 12h30
  4. [langage] Arithmétique en virgule flottante
    Par marouanitos dans le forum Langage
    Réponses: 3
    Dernier message: 19/09/2003, 14h48
  5. [Kylix] Kylix3: Pb de virgule flottante
    Par hubble dans le forum EDI
    Réponses: 1
    Dernier message: 22/06/2003, 16h36

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