Pages : 1
#1 Le 21/03/2007, à 10: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, à 11: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, à 12: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, à 13: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
Pages : 1