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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    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 Expert
    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
    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 ....

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 086
    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 chevronné

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    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

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    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 ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    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.

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    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 -_-.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 295
    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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 115
    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

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