Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/03/2007, à 11:38

laroche1

division par 0

Bonjour

C'est un programme qu'on m'a refilé or il y a une erreur et je sais pas comment la résoudre , ça plante  à partir de xtemp=0.0
Quand je fais un affichage de p , il affiche :
0 nan
1 une valeur
2 une valeur
et bien sur cette erreur se repercute sur le calcul des autres variables, je pense que le probleme vient d'une division par 0 et donc comment pourrais je empecher ça?
merci


int linbcgd(tol, itmax, err, number_of_obs, number_of_dip, filename)
int itmax, number_of_obs, number_of_dip;
double tol, err;
char *filename;

      { 
        double *p, *r, *rp, *w, *s;
	double aknum, akden, ak;
	double bknum, bkden, bk;
	int    i, j;
	double xtemp;
	double *x_old, err_old;
	FILE   *fout;
	char   str[80];
	int    iter;

	x_old = (double *)malloc(number_of_dip*sizeof(double));

	p  = (double *)malloc(number_of_dip*sizeof(double));
	r  = (double *)malloc(number_of_dip*sizeof(double));
	rp = (double *)malloc(number_of_dip*sizeof(double));

	w = (double *)malloc((number_of_obs+1)*sizeof(double));
	s = (double *)malloc((number_of_obs+1)*sizeof(double));

	

	iter = 0;
       
	/* Dc = donnees ponderees par leur sigma */
	/* Taille = N_X+N_Y+N_Z */

	dsprstx(number_of_obs, number_of_dip, Dc, r);

	
	for (i = 0; i < number_of_obs; i ++) 

	  {
	    s[i] = Dc[i];


	  }
	fprintf(stdout, "err %3d : %15.10lf\n", iter, sderr(s, number_of_obs));

	fflush(stdout);

/* 	dsprstx(N_X+N_Y+N_Z+1, 3*N_DIP, Dc, r); */


/* 	fprintf(stdout, "err %3d : %15.10lf\n", iter, err); */
/* 	fflush(stdout); */

	xtemp = 0.0;

	for (i=0; i < number_of_dip; i++)
	  {
	    p[i] = r[i];
fprintf(stdout, "%3d %lf\n",i,p[i]);
	  }
		
	do
	  {
	    iter ++;
	    dsprsax(number_of_dip, number_of_obs, p, w);
	    aknum = 0.0;
	    akden = 0.0;
	    
	    for (j = 0; j < number_of_dip; j ++)
	      {
		aknum += r[j]*r[j];

	      }

	    for (j = 0; j < number_of_obs; j ++)
	      {
		akden += w[j]*w[j];

	      }
	    ak = aknum / akden;
	    
	    for (j = 0; j < number_of_dip; j ++)
	      {
		x[j] += ak*p[j];
		
		

	      }
	    for (j = 0; j < number_of_obs; j ++)
	      {
		s[j] -= ak*w[j];

	      }
	    
	    err = sderr(s, number_of_obs);
	    xtemp = sderr(x, number_of_dip);
	    
	    for (j = 0; j < number_of_dip; j++)
	      {
		rp[j] = r[j];
	      }

			
	    dsprstx(number_of_obs, number_of_dip, s, r);
	    
	    fprintf(stdout, "iter %3d, SD : %15.10lf, RMS: %15.10lf\n",
		    iter, err, xtemp);
	    fflush(stdout);

merci

Hors ligne

#2 Le 21/03/2007, à 12:59

Dipash' el Grande

Re : division par 0

Tu dois juste rajouter un test avant de réaliser la division

if (akden!=0)
{
ak = aknum / akden;
}

mais le vrai problème est de définir ce que doit réaliser le programme si akden == 0

je ne vois pas trop à quoi peut servir ta fonction mais rajoute déjà ces lignes et dans le else, rajoute :

fprintf(stdout, "division par 0\n");

tu sauras déjà si ton bug vient de là

Hors ligne

#3 Le 21/03/2007, à 13:43

laroche1

Re : division par 0

Ben en fait le probleme commence à buger à partir de :$

xtemp = 0.0;

	for (i=0; i < number_of_dip; i++)
	  {
	    p[i] = r[i];
	  }
			
	fprintf(stdout, "%3d %lf\n", i, p[i]);

des ici il maffiche :
err   0 :    1.9564892660
  0 nan
  1 23306990.836759
  2 17471219.865483

alors je pensais changer dans ma boucle for , le i et commncer de 1 , c'est valable?

Hors ligne

#4 Le 21/03/2007, à 14:27

Dipash' el Grande

Re : division par 0

ça t'éviterai ce problème mais tu risquerais de le retrouver ailleur par la suite

c'est bizarre que ta première valeur du tableau ne soit pas un double (nan= Not a Number)

est-ce que tu peux rapidement m'expliquer le pourquoi du programme et définir les variables d'entrées?

Hors ligne