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

Lazarus Pascal Discussion :

Runtime error 207 sur calcul itératif [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 56
    Points : 38
    Points
    38
    Par défaut Runtime error 207 sur calcul itératif
    Bonjour,

    Voila sous Lazarus 1.0.10 sous ubuntu 13.10 , j'ai voulu m'amuser a me faire mon petit programme de génération d'image fractale ( je sais il en existe plein en cherchant sur le web , mais ça fait plus plaisir de chercher a comprendre le pourquoi du comment )
    Je me suis inspiré d'un site qui explique très la méthode adaptable a tout style de programmation

    Après quelques erreurs de variable et autre j'ai réussi a le lancer pour une image de 800x600
    or on dira en coordonnée de l'image [0,712] j'ai eu l'erreur "Runtime error 207" suivant la faq , j'ai donc penser a une erreur de calcul division par zéro ou autre ...
    Or après plusieurs essai sur une image de 320x200 j'en réalise 1/4

    J'en déduit donc que c'est le calcul récursif provoque le débordement de la pile ( ce que l'on a pas en PHP )

    pourtant je ne fait au maximum 32 itérations, donc existe moyen de "nettoyer" la pile pour éviter le débordement

    Merci de votre aide ou piste de travail

    voici le code et variable sur un Tbutton qui lance le calcul

    centx,centy pour centrer l'image en x et y
    zoom la résolution ou zoom
    Mxiti le nombre d'itération maximal
    lgx et lgy la taille de l'image

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    procedure TForm1.Button1Click(Sender: TObject);
     
    var
      MIti       : integer ;
      iti        : integer ;
      x,y        : real;
      ech        : real;
      Vx,Vy      : real;
      i,j        : integer;
      zi,zr,tmp  : real;
     
    begin
     
      Miti:=StrToInt(MxIti.Text);
      ech:=StrToInt(zoom.Text);
      // calcul des bornes de l'image
      x:=-StrToInt(LgX.Text)/2/ech+StrToFloat(centx.Text);
      y:=-StrToInt(LgY.Text)/2/ech+StrToFloat(centy.Text);
      img.Height:=StrToInt(LgY.Text);
      img.Width:=StrToInt(LgX.Text);
      img.Picture.Clear;
      for j:=0 to img.Height do
        for i:=0 to img.Width do
          begin
            iti:=0;
        zi:=0;
        zr:=0;
        vx:=i/ech+x;
        vy:=j/ech+y;
        while (iti<Miti) and ((zr*zr-zi*zi)<4) do
              begin
            iti:=iti+1;
            tmp:=zr;
            zr:=zr*zr-zi*zi+vx;
                zi:=2*zi*tmp+vy;
             end;
            if (iti<miti) then
              begin
                img.Canvas.Pixels[i,j]:=RGBToColor(round(iti*255/miti),0,0);
                //application.ProcessMessages;
              end;
            if (iti=miti) then
              begin
                img.Canvas.Pixels[i,j]:=RGBToColor(255,255,0);
                //application.ProcessMessages;
              end;
            end;
      messageDlg('Rendu fini',MtInformation,[MbOk],0);
    end;
    Un peu touche a tous

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    C'est de l'itératif, pas du récursif...

    207 Invalid floating point operation
    Can occur if you try to calculate the square root or logarithm of a negative number.
    Ce qui ne m'étonne pas vu que je vois des nombres élevés au carré dans la boucle...

    Essayez en modifiant comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //zr := zr * zr - zi * zi + vx;
    zr := (zr + zi) * (zr - zi) + vx;
    Cela devrait retarder le débordement sur les nombres réels.
    Philippe.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Merci ,

    J'ai modifier le titre ...

    j'ai donc modifier comme tu m'as dit , ça ne change rien .

    Par contre j'ai activé le débogage pour retrouver la ligne incriminé et le plus surprenant c'est un calcul plutot simple et nom pas dans les formules au carré

    par ailleurs pourtant pour éviter tout débordement de calcul on arrête des que Zi²-Zr² dépasse 4

    Peut on agir sur la dimension de cette pile ? ou trouver un autre moyen ??

    Merci
    Un peu touche a tous

  4. #4
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    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 552
    Points : 3 920
    Points
    3 920
    Par défaut
    Ce qui ne m'étonne pas vu que je vois des nombres élevés au carré dans la boucle...
    Petite question : tu nous parle d'appels récursifs mais où se trouve donc l'instruction qui les provoque ?
    Un appel récursif suppose l'existence d'une fonction qui s'appelle elle-même, ou de fonctions qui s'appellent mutuellement, ton code n'en montre pas.
    La lecture de Run-time errors donne une indication assez claire de l'origine du problème.

    S'il s'agit d'un débordement de portée sur les real, pourquoi ne pas changer le type en Extended cf Real types. En outre, les real sont dépendants de la plate-forme (4 ou 8 octets, ça change bien des choses), c'est risqué sans prendre de précautions ...


    @+

    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."

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 56
    Points : 38
    Points
    38
    Par défaut
    Désolé pour le retard ...
    Donc le passage en type Extendend a partiellement régler mon problème. possibilité de faire des images de 320x200 avec un maximum de 32 itérations.
    Avec des images de 640x480 ou plus de 32 itérations ça recommence...

    Donc , en continuant mes recherches sur le net j'ai trouver dans un projet fractale avec une unité nombre_complexe qui m'a réglé ce problème.
    En me servant de la base j'ai pu faire des images de 1280x1024 avec 255 itérations .

    Maintenant je vais continuer mon petit projet, qui au final pourra créer des vidéos de voyage au milieu d'une fractale...

    Encore merci de votre aide
    Christophe
    Un peu touche a tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. API schneider : Calcul itératif sur flottants
    Par bendangers dans le forum Automation
    Réponses: 1
    Dernier message: 31/10/2009, 17h13
  2. Runtime error sur DREAMWEAVER
    Par sainerembert dans le forum Dreamweaver
    Réponses: 0
    Dernier message: 11/01/2009, 21h03
  3. Runtime error 76 sur windows server 2003 anglais et pas XP
    Par Popaul22 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/08/2008, 01h26
  4. Réponses: 6
    Dernier message: 26/11/2007, 15h25
  5. Réponses: 2
    Dernier message: 24/01/2007, 13h58

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