Erreur -1.#INF00 en C

Kelm -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Mon problème est le suivant :
j'obtiens la valeur -1.#INF00 ou -1.#IND00 pour : la valeur de la matrice dont la colonne >1;

En sachant que j'initialise ma matrice de taille n*n à 0 ;

Voici le partie où j'ai l'erreur:

for(i=1;i<n;i++)
{
for(j=1;j<=i;j++)
{
F[i][j]=((F[i][j-1])-(F[i-1][j-1]))/(X[i-1]-X[i-j]);

// printf("%e %e \n",F[i-1][j-1],F[i][j-1]);
//--> Pour F[i-1][j-1] et F[i][j-1] j'ai -1.#INF00 ou -1.#IND00 quand j>1
}
}


Je ne comprend pas pourquoi ...

Merci d'avance pour vos réponse .

3 réponses

Hxyp Messages postés 401 Date d'inscription   Statut Membre Dernière intervention   54
 
Bonjour,
Je ne sais pas d'où vient le problème j'attendais que quelqu'un donne la réponse ahah , on dirait que i et j sont affectés par la ligne
F[i][j]=((F[i][j-1])-(F[i-1][j-1]))/(X[i-1]-X[i-j]);
Seulement lorsqu'on ajoute une variable sans l'utiliser i et j ne sont pas affectés j'ai testé comme ça :
void test(void)  
  {  
    double F[2][2]={{1.3,2.4},{4.1,9.3}};  
    double X[4]={1,2,3,4};  
/* le x qui sert à rien ici */  
    int i,j,n,x;  
    for(i=1,n=4;i<n;i++)  
      {  
        for(j=1;j<=i;j++)  
          {  
            printf("i-1 %d j-1 %d i[%d]j[%d]\n",i-1,j-1,i,j);  
            F[i][j]=(F[i][j-1]-F[i-1][j-1])/(X[i-1]-X[i-j]);  
          }  
      }  
  }  
int main(int argc,char **argv)  
  {  
    test();  
    return EXIT_SUCCESS;  
  }  

Sans le "x" et en compilant "normalement" avec
$gcc -c main.c
$gcc -o main main.o
ça créer une boucle infini :
$ ./main  
i-1 0 j-1 0 i[1]j[1]  
i-1 1 j-1 -1 i[2]j[0]  
i-1 1 j-1 -1 i[2]j[0]  
...  

avec le "x" d'ajouté ..
$ ./main  
i-1 0 j-1 0 i[1]j[1]  
i-1 1 j-1 0 i[2]j[1]  
i-1 1 j-1 1 i[2]j[2]  

me suis dit que ça venait du code asm généré à la compilation alors en compilant sans la variable x comme ceci avec l'option d'optimisation -O2 :
$gcc -O2 -c main.c
$gcc -o main main.o
pas de boucle infini mais résultat encore différent . . .
$ ./main  
i-1 0 j-1 0 i[1]j[1]  
i-1 1 j-1 0 i[2]j[1]  
i-1 1 j-1 1 i[2]j[2]  
i-1 2 j-1 0 i[3]j[1]  
i-1 2 j-1 1 i[3]j[2]  
i-1 2 j-1 2 i[3]j[3]  

Au début je m'étais dit que le problème venait des "i-1" "j-1" et "i-j" mais quand en ajoutant seulement une variable inutile ça change le comportement... j'y comprend rien

Edit: corrections etc
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,

@ Hxyp,
F[i][j]=((F[i][j-1])-(F[i-1][j-1]))/(X[i-1]-X[i-j]);
A la deuxième itération i vaut 2 (condition ok car 2<n).
Le problème est que F[2][j] n'est pas défini car le tableau est de taille [2][2]. Du coup, le programme écrit en dehors du tableau. Selon l'organisation de la pile, il se peut qu'il récrive sur les variables i et autre. Du coup, ça part en boucle infini.

Le fait de rajouter un x fait en sorte qu'il s'intercalera entre la variable i et le tableau F. Du coup en récrivant dans la pile, la réécriture se fera sur x et non sur i. Voilà pourquoi, tu peux avoir des bizarreries comme ça.

Attention donc à bien faire en sorte de ne pas écrire en dehors du tableau. Petite astuce, vous testez la première itération, et la valeur maximale (les limites) et vous regardez si tout se passe bien.

Cdlt,

Google is your friend
0
Hxyp Messages postés 401 Date d'inscription   Statut Membre Dernière intervention   54
 
Merci fiddy, je comprend mieux maintenant ! Par contre encore un problème testé avec un simple tableau et j'ai bien une "erreur de segmentation" quand je le dépasse de lui même par exemple char a[2]; a[2]='x'; ,mais pas d'erreur quand je passe d'un tableau à un autre et que je dépasse l'autre avec le premier
#include <stdio.h> 
int main() 
  { 
    char a[6]="hello\0"; 
    char x[2]; 
    int i; for(i=0;i<6;i++) 
      { 
        x[i]=a[i]; 
      } 
    x[2]='x'; 
    printf("%s\n",x); 
    return 0; 
  } 

résultat : hexlo
normalement devrait pas y avoir une erreur ?
Aah j'ai compris là, l'erreur survient que lorsque la mémoire totale est dépassée du coup il est permit d'écraser d'autre variables tant qu'il y a de la place! avec le code ici ça donne 6char+2char+1int = 8+4 = 12 oct max
du coup on peut faire x[11]='x' sans erreur mais x[12]='x' y a l'erreur !!! eureka ahahah
Merci encore !
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Eh voui, plus on déborde dans la pile, et plus on risque d'écraser des bytes importants. Par exemple, tu peux écraser l'eip au sein d'une fonction (principe souvent utilisé pour l'exploitation des stack overflow). En récrivant à des endroits interdits, tu obtiendras un segfault.
0
Kelm
 
Bonjour ,
Tout d'abord ,merci pour vos réponse .

J'ai passé quelque minutes à chercher une solution après avoir lu vos réponse . J'ai fait des printf partout et j'ai trouvé !
Un truc Bête et débile ... Je divisais pas 0 c'est pour ça qu'il me faisait forme indéterminée.

Désole de vous avoir fait perdre votre temps .
0