problèmes de précision

problèmes de précision - C - Programmation

Marsh Posté le 07-07-2004 à 12:11:50    

Bonjour à tous
 
Voilà, comme d'habitude, j'ai un problème.
J'ai programmé quelques fonctions, on faisant toujours attention à déclarer mes variables en double, et non en float (j'ai besoin de grands nombres, et surtout d'au moins 10 décimales).
Seulement, il apparait que lors d'une bête addition, on me renvoie un truc du genre 10E20 + 10E20 = -Inf (je suis pas sûr de la puissance, mais bon, ça devrait pas arriver avec des exposants aussi petits en double).
D'où ma question : quand on déclare une variable en double, peut-elle être implicitement castée en float (avec la perte de précision que cela entraîne), ou alors est-ce que le double de la déclaration "l'emporte" ???
Par exemple :
 
double x,y;
y=(un double quoi);
x=1.0/y;   ----> x est double ou float maintenant ???

Reply

Marsh Posté le 07-07-2004 à 12:11:50   

Reply

Marsh Posté le 07-07-2004 à 12:25:37    

Juste une petite chose .... pour les calculs, j'utilise pas mal de #define pour déclarer des constantes, dans un fichier .h
Peut-on spécifier le format de la constante par la même occasion ?

Reply

Marsh Posté le 07-07-2004 à 13:09:14    

non elle est en double là y'a pas de doute.
 


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 07-07-2004 à 13:17:46    

La variable est stockée en double, mais le résultat est-il obtenu par exemple en faisant (double) (1.0/y) ou ((double) 1.0) /y ??? ce qui ne me semble pas tout à fait équivalent

Reply

Marsh Posté le 07-07-2004 à 14:13:35    

Pour etre un peu plus clair, voila ou ca coince ...

Code :
  1. void odeint(double ystart[], unsigned long nvar, double t1, double t2, double eps, double h1, double hmin, int *nok, int *nbad, void (*derivs)(double *,
  2. double *, unsigned long, double, double **, double **, unsigned long *), void (*rkqs)(double *, double *, unsigned long , double *, double , double , double *, double *, double
  3. *, void (*)(double *, double *, unsigned long, double, double **, double **, unsigned long *), double , double **, double
  4. **, unsigned long *), double dx, double **a, double **a1, unsigned long *indx)
  5. {
  6.   unsigned long nstp,i,n;
  7.   double tsav,t,hnext,hdid,h;
  8.   double *yscal,*y,*dydt;
  9.  
  10.   n=nvar/4;
  11.   yscal=dvector(1,nvar);
  12.   y=dvector(1,nvar);
  13.   dydt=dvector(1,nvar);
  14.   t=t1;
  15.   h=SIGN(h1,t2-t1);
  16.   *nok = (*nbad) = kount = 0;
  17.   for (i=1;i<=nvar;i++) y[i]=ystart[i];
  18.   if (kmax > 0) tsav=t-dtsav*2.0;  // stockage du premier pas
  19.   for (nstp=1;nstp<=MAXSTP;nstp++) {
  20.     (*derivs)(y,dydt,n,dx,a,a1,indx);   ---> ca foire ici, la fonction marche quand je l'utilise a part, mais ici, j'ai du Nan qui apparait, avec les memes arguments en entree
  21.     for (i=1;i<=nvar;i++) yscal[i]=fabs(y[i])+fabs(dydt[i]*h)+TINY2;
  22.     if (kmax > 0 && kount < kmax-1 && fabs(t-tsav) > fabs(dtsav)) {
  23.     tp[++kount]=t;  // stockage des valeurs intermediaires
  24.     for (i=1;i<=nvar;i++) yp[i][kount]=y[i]; tsav=t;
  25.     }
  26.   if ((t+h-t2)*(t+h-t1) > 0.0) h=t2-t;  // si l'on sort du domaine, on reduit le pas
  27.   (*rkqs)(y,dydt,n,&t,h,eps,yscal,&hdid,&hnext,derivs,dx,a,a1,indx);
  28.   if (hdid == h) ++(*nok);
  29.   else ++(*nbad);
  30.   if ((t-t2)*(t2-t1) >= 0.0) {
  31.     for (i=1;i<=nvar;i++) ystart[i]=y[i];
  32.     if (kmax) {
  33.     tp[++kount]=t;  // sauvegarde des dernieres valeurs
  34.     for (i=1;i<=nvar;i++) yp[i][kount]=y[i];
  35.     }
  36.   free_dvector(dydt,1,nvar);
  37.   free_dvector(y,1,nvar);
  38.   free_dvector(yscal,1,nvar);
  39.   return;
  40.   }
  41.   if (fabs(hnext) <= hmin) nrerror("Step size too small in odeint" );
  42.   h=hnext;
  43.   }
  44.   nrerror("Too many steps in routine odeint" );
  45. }

Reply

Marsh Posté le 07-07-2004 à 14:14:32    

desole pour la declaration de fonction, c'est vraiment bourrin, mais j'ai rien trouve de mieux que ca .....

Reply

Marsh Posté le 07-07-2004 à 14:16:47    

les typedef abruti :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed