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 :

Problème virgule flottante


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Points : 23
    Points
    23
    Par défaut Problème virgule flottante
    Bonjour,

    Voilà... je m'arrache les cheveux sur une erreur.
    La fonction suivante me retourne une erreur de virgule flottante qui se déclenche à l'étape "result := result+1".

    arr_Index_E_Evaluation est un tableau d'entier.
    arr_Donnees est un tableau à 2 dimensions de double.

    Si quelqu'un voulait bien prendre soin de mes cheveux. Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function Calculer_Pourcentage_Commun(AIndex_X,AIndex_Y: integer): double;
    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
    function Calculer_Pourcentage_Commun(AIndex_X,AIndex_Y: integer): double;
    var
      i,Index_E: integer;
    begin
      result := 0.0;
      if Length(arr_Index_E_Evaluation)=0 then
        exit;
     
      for i := 0 to High(arr_Index_E_Evaluation) do
      begin
        Index_E := arr_Index_E_Evaluation[i];
        if not isNaN(arr_Donnees[AIndex_X,Index_E]) and not isNaN(arr_Donnees[AIndex_Y,Index_E]) then
          result := 1.0+result;
      end;
     
      result := result/High(arr_Index_E_Evaluation);
    end;
    PS : j'ai essayé de modifier mon code en ceci :
    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
    function Calculer_Pourcentage_Commun(AIndex_X,AIndex_Y: integer): double;
    var
      i,Index_E,Compte: integer;
    begin
      Compte:= 0.0;
      result := 0.0;
      if Length(arr_Index_E_Evaluation)=0 then
        exit;
     
      for i := 0 to High(arr_Index_E_Evaluation) do
      begin
        Index_E := arr_Index_E_Evaluation[i];
        if not isNaN(arr_Donnees[AIndex_X,Index_E]) and not isNaN(arr_Donnees[AIndex_Y,Index_E]) then
          Compte:= 1+Compte;
      end;
     
      result := Compte/High(arr_Index_E_Evaluation);
    end;
    Ca plante alors sur la dernière ligne.

  2. #2
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var
      i,Index_E,Compte: integer;
    begin
      Compte:= 0.0;
    LA c'est normal ... compte est declaré comme integer ....
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Points : 23
    Points
    23
    Par défaut
    oui oui
    Mais bon. C'est un mauvais copier coller
    En fait, c'est bien un 0. Ca compilerait pas sinon d'ailleurs je crois.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 553
    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 553
    Points : 25 133
    Points
    25 133
    Par défaut
    Essaye d'utilise Inc(Result) ...

    sinon, c'est vrai que c'est étrange, je n'ai pas testé le code, pour voir si j'avais pareil (pas bcp de temps)
    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

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2003
    Messages : 115
    Points : 129
    Points
    129
    Par défaut
    Citation Envoyé par cretindezalpes
    La fonction suivante me retourne une erreur de virgule flottante qui se déclenche à l'étape "result := result+1".
    Salut
    Es-tu sûr que c'est cette ligne qui déclenche ? chez moi c'est souvent (pour pas dire à 95%) la ligne précédente qui déclenche l'exception ...
    Sinon, As-tu coché les DCU de débogage ?
    ensuite, il faudrait voir ce que vaut i, arr_Donnees[AIndex_X,Index_E] et arr_Donnees[AIndex_Y,Index_E] au moment de l'exception (à tester dans un try ... except par exemple)

    JP
    JP

    N'ayez pas peur de la perfection, vous ne l'atteindrez jamais !
    Salvador Dali

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Salut,

    je pense qu'il serait beaucoup mieux de travailler avec une variable locale, au lieu de travailler à partir de ta variable de retour. Par exemple tu peux définir une variable pourcent de type double, et une variable iNbIterations de type integer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var pourcent : double;
                   iNbiterations : integer;
    ensuite pour remplacer ton result := result + 1:

    et enfin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result := iNbIterations/High(arr_Index_E_Evaluation);
    Essaie celà...

    A plus,

    Christopher

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Juste une petite question : si le tableau a un seul élément alors High(...) est égal à 0 et on a une division par 0 ? Non ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Points : 23
    Points
    23
    Par défaut
    1. Inc n'accepte que des entiers je crois.

    2. C'est bien l'affectation à result qui plante. Pas la ligne sur la condition. J'en veux pour preuve mon second code qui ne plante pas lors du "Compte := Compte+1". Ni avant.

    3. J'ai mis tout ça entre des try except. J'ai mis les valeurs de mon tableau dans des variables temporaires. Elles ont des valeurs normales et justes (Index dans les limites des tableaux et valeurs de Données réelles ou bien égales à "NaN").

    J'ai quasiment plus de cheveux...

    Merci pour votre aide

    EDIT : ca existe IntToFloat ?
    EDIT 2: oui ca planterait. J'aurais du mettre length. Mais le tableau fait 500 de longueur.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Points : 23
    Points
    23
    Par défaut
    Regardez ce code.
    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
    function Calculer_Pourcentage_Commun(AIndex_X,AIndex_Y: integer): double;
    var
      i,Index_E: integer;
      d1,d2: double;
      Compte: integer;
    begin
      if Length(arr_Index_E_Evaluation)=0 then
        exit;
      try
        try
          result := 0.0;
          Compte := 0;
          for i := 0 to High(arr_Index_E_Evaluation) do
          begin
            Index_E := arr_Index_E_Evaluation[i];
            d1 := arr_Donnees[AIndex_X,Index_E];
            d2 := arr_Donnees[AIndex_Y,Index_E];
            if not isNaN(d1) and not isNaN(d2) then
              Inc(Compte);
          end;
     
          result := Compte/Length(arr_Index_E_Evaluation);
        except
          on e:exception do
          begin
            if e.Message<>'' then
              MessageDlg(e.Message+#13+
                          'Compte='+FloatToStr(Compte)+#13+
                          'd1='+FloatToStr(d1)+#13+
                          'd2='+FloatToStr(d2)+#13+
                          'Index_E='+intToStr(Index_E),mtError,[mbOk],0);
            result := Compte/Length(arr_Index_E_Evaluation);
          end;
        end;
      finally
      end;
    end;
    Ben croyez le ou pas, ca plante pas au second essai dans le except -_-.

  10. #10
    Membre habitué Avatar de Ludo_360
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    295
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 295
    Points : 191
    Points
    191
    Par défaut
    si tu essais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    result := round(1.0+result);
    Ca ne te conviendrait pas?

    ludo

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Points : 23
    Points
    23
    Par défaut
    Pour préciser le problème.

    Lorsque je lance mon calcul, cette fonction est appelée 100 fois (environ).
    Le plantage est systématique sur le second appel. Ce ne plante plus pour les 98 fois restantes.

    Si je relance mon calcul une seconde fois. Ca ne plante plus du tout. En fait, ce ne plante plus jamais.

    EDIT : (d'ou l'idée de refaire un essai dans le except, idée concluante)

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Re,

    Mais ton tableau tu l'as crée dynamiquement ou il est créé comme variable globale, comme ceci var arr... : array[0..100] of integer;?????

    Est ce que la valeur de retour de High() renvoie une valeur différente de 0???

    A plus,

    Christopher

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Points : 23
    Points
    23
    Par défaut
    Mon tableau arr_Index_E_Evaluation est dynamique. Sa taille vaut à peu près 500 au cours de mes tests. Elle est initialisée avant l'appel de ma fonction.

    Ce tableau contient des indices de la second dimension de mon tableau arr_Donnees, lui aussi dynamique.

    arr_Donnees a une taille qui vaut 10x900 dans mon problème, initialisé dynamiquement au préalable.

    Je ne pense pas que le problème vienne des tableaux car ceux-ci sont employés à beaucoup d'autres endroits sans problème.

    Encore une fois, le plantage n'intervient pas à la lecture des valeurs du tableaux. Le débugage au pas à pas me le démontre clairement mais bien au moment de l'affectation d'une valeur à result.

  14. #14
    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 266
    Points
    3 266
    Par défaut
    Au passage, vu que Clorish a déjà signalé que Compte : integer en conséquence de quoi profites-en pour :
    - remplacer : 'Compte='+FloatToStr(Compte)+#13+...
    - par 'Compte='+IntToStr(Compte)+#13+...

    ... cela ne réglera peut-être pas tous les problèmes mais ta bécane ne s'en plaindra pas.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Points : 23
    Points
    23
    Par défaut
    ^^

  16. #16
    Membre actif
    Profil pro
    DEV
    Inscrit en
    Août 2006
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DEV

    Informations forums :
    Inscription : Août 2006
    Messages : 182
    Points : 211
    Points
    211
    Par défaut
    As tu essayé de stocker la valeur de High(...) dans une variable temporaire?
    Je ne pense pas que cela change grand chose mais on ne sait jamais ...

  17. #17
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Je voulais savoir si le tableau dynamique arr_Donnees est une matrice "pleine" (c'est un tableau dont tous les vecteurs ont la même taille) ou un tableau de vecteurs de tailles différentes ?

    Cdlt

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Points : 23
    Points
    23
    Par défaut
    La matrice est initialisée avec un

    SetLength(arr_Donnees,Dim1,Dim2) où Dim1 et Dim2 sont des Entiers. Donc oui, les vecteurs ont tous la même taille.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Points : 23
    Points
    23
    Par défaut
    Je pense de plus en plus pour un problème lié à des pertes de mémoire.

    Je viens d'avoir une autre erreur très similaire aujourd'hui : une procédure appelée n fois, utilisant une variable globale de mon projet de type Entier.

    Au deuxième appel, elle plante car la variable ne pointe plus vers rien alors que nul part, celle-ci n'est modifiée.

    Ce programme marchait très bien il y a 3 semaines .

Discussions similaires

  1. problème virgule flottante de delphi
    Par khadi8 dans le forum Langage
    Réponses: 4
    Dernier message: 14/02/2012, 17h27
  2. Problème de virgule flottante
    Par lolitta_dz dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/03/2008, 12h21
  3. Problème de virgule flottante
    Par breizh44 dans le forum Débuter
    Réponses: 9
    Dernier message: 21/02/2008, 16h23
  4. [D7] Problème de virgule flottante
    Par Magnus dans le forum Langage
    Réponses: 17
    Dernier message: 22/09/2005, 14h56
  5. Probléme de débordement en virgule flottante
    Par wikers dans le forum Langage
    Réponses: 7
    Dernier message: 05/08/2005, 17h35

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