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

Fortran Discussion :

Division par zéro


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 20
    Points : 19
    Points
    19
    Par défaut Division par zéro
    Bonjour !

    J'ai un problème dont l'erreur est :
    Floating point divide by zero

    au niveau de l'égalité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    beta(i) = A(i,i) - (A(i-1,i)*A(i,i-1))/beta(i-1)
    il y a un problème car pour i = 2 est égal à 0.5 dans un exemple.

    Sinon pour une valeur entière, l'algo fonctionne.

    Voici le passage dans l'algo qui bloque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    REAL A(100,100), B(100), alpha(100), beta(100)
    alpha(1) = A(1,1);
    beta(1) = B(1)/A(1,1);
     
    DO i=2,n,1
       beta(i) = A(i,i) - (A(i-1,i)*A(i,i-1))/beta(i-1)
    ENDDO
    Je pense que le problème vient donc du fait que je n'arrive pas à déclarer le diviseur comme étant une valeur réelle car l'erreur dit bien que je divise par 0...

    merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Citation Envoyé par gRaNdLeMuRieN
    Je pense que le problème vient donc du fait que je n'arrive pas à déclarer le diviseur comme étant une valeur réelle car l'erreur dit bien que je divise par 0...
    C'est très peu probable. Il y a le rsique d'une faute de frappe, mais si tu utilises implicit none, tu réduis beaucoup ce risque.

    Comme ton exemple est incomplet, il est difficile d'isoler le problème (n > 100 ?, A() non initialisé ? etc...).

    La suggestion que je peux te faire, c'est d'ajouter un write juste avant le calcul de beta et d'imprimer les variables qui seront utilisées.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 20
    Points : 19
    Points
    19
    Par défaut Algorithme de Thomas
    Voici le code en entier:

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    ! Corps du programme principal
    !
    PROGRAM Test
    
    REAL A(100, 100), B(100), Xk(100)
    INTEGER n
    
    n=5
    !Remplissage de la matrice
    DO i=1,n,1
      DO j=1,n,1
         IF (i .EQ. j) THEN
            A(i,j) = 2
         ELSEIF ((i .EQ. j-1) .OR. (i .EQ. j+1)) THEN
            A(i,j) = -1
         ELSE
            A(i,j) = 0
         ENDIF
      ENDDO
    ENDDO
    
    DO i=1,n,1
       B(i)=1
    ENDDO
    
    CALL algoThomas(A,B,n,Xk)
    
    PRINT *,'_________________________'
    PRINT *,' Solution :'
    PRINT *,'_________________________'
    
    DO i=1,n,1
      PRINT*, Xk(i)
    ENDDO  
    
    END
    
    
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !
    ! Nom :
    ! algoThomas
    !
    ! Fonctionallite :
    ! Resolution de A.X=B par l'algorithme de THOMAS
    !
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
    
    SUBROUTINE algoThomas(A,B,n,Xk)
    REAL A(100,100), B(100), alpha(100), beta(100), Xk(100), Xkplus1
    alpha(1) = A(1,1);
    beta(1) = B(1)/A(1,1);
    
    DO i=2,n,1
      ! j = beta(i-1)
       beta(i) = A(i,i) - (A(i-1,i)*A(i,i-1))/ beta(i-1)
       alpha(i) = (B(i) - A(i,i-1)*alpha(i-1))/beta(i)
    ENDDO
    
    Xk(n) = alpha(n);
    DO k=1,n-1,1
       Xkplus1 = Xk(n-k+1)
       Xk(n-k) = alpha(n-k) - (A(n-k,n-k+1)/beta(n-k))*Xkplus1
    ENDDO
    
    RETURN
    END
    si beta(i-1) = un entier alors le programme semble fonctionner...

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    En modifiant comme suit le programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DO i=2,n,1
      ! j = beta(i-1)
      write(0,*) 'i=',i,' A(i,i)=',A(i,i),' A(i-1,i)=',A(i-1,i),' A(i,i-1)=',A(i,i-1),' beta(i-1)=',beta(i-1)
       beta(i) = A(i,i) - (A(i-1,i)*A(i,i-1))/ beta(i-1)
      write(0,*) 'beta(i)=',beta(i)
       alpha(i) = (B(i) - A(i,i-1)*alpha(i-1))/beta(i)
    ENDDO
    Le programme affiche les beta successifs suivants :

    beta(1) = 0.5
    beta(2) = 0.
    beta(3) = Inf
    ...

    Ce qui me semble conforme aux opérandes.

    Si tu crois que beta doit être entier, c'est alors une question d'algorithme ou de formule, ce que je n'ai pas examiné.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    les beta(i) ne sont pas obligatoirement des entiers. Je voulais juste préciser qu'avec des entiers l'algo semblait fonctionner.

    Quand j'applique ton code Sylvain, j'ai cette erreur qui apparait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Run-time Error
    
    Error 94, Unit has netheir been OPENed nor preconned
    ligne 64
    ligne 64:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(0,*) 'i=',i,' A(i,i)=',A(i,i),' A(i-1,i)=',A(i-1,i),' A(i,i-1)=',A(i,i-1),' beta(i-1)=',beta(i-1)


    Sur ta machine tu obtiens un vecteur solution avec quelle valeur stp? et sans erreur de compilation et d'exécution?

    Car moi avec FTN95, la compilation n'indique pas d'erreurs, mais c'est à l'exécution que ça plante !

    merci ;-)

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Error 94, Unit has netheir been OPENed nor preconned
    Mon compilateur préconnecte le unit 0 sur StdError. Ça devrait fonctionner si tu remplace le 0 par 6 (StdOut)...

    Résultats? J'obtiens des NaN (not a number).

Discussions similaires

  1. Division par zéro
    Par soltani1 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 18/05/2006, 09h42
  2. [Tableaux] Pb de division par zéro...
    Par blueice dans le forum Langage
    Réponses: 8
    Dernier message: 16/12/2005, 15h52
  3. [CR][VS.NET]Division par zéro
    Par San Soussy dans le forum SDK
    Réponses: 2
    Dernier message: 31/08/2005, 14h40
  4. [CR8.5] Problème de division par zéro sur formule
    Par franck.cvitrans dans le forum Formules
    Réponses: 3
    Dernier message: 10/06/2004, 13h41
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 18h14

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