Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1678 connectés 

  FORUM HardWare.fr
  Programmation
  C

  problèmes de précision

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problèmes de précision

n°788945
bibi218
Posté le 07-07-2004 à 12:11:50  profilanswer
 

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 ???

mood
Publicité
Posté le 07-07-2004 à 12:11:50  profilanswer
 

n°788956
bibi218
Posté le 07-07-2004 à 12:25:37  profilanswer
 

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 ?

n°789042
jagstang
Pa Capona ಠ_ಠ
Posté le 07-07-2004 à 13:09:14  profilanswer
 

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?  
n°789060
bibi218
Posté le 07-07-2004 à 13:17:46  profilanswer
 

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

n°789138
bibi218
Posté le 07-07-2004 à 14:13:35  profilanswer
 

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. }

n°789139
bibi218
Posté le 07-07-2004 à 14:14:32  profilanswer
 

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

n°789145
Taz
bisounours-codeur
Posté le 07-07-2004 à 14:16:47  profilanswer
 

les typedef abruti :o


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  problèmes de précision

 

Sujets relatifs
[IE & Mozilla] A peine commencé déja des problèmesproblèmes de Threads .
Shell sh/tcsh : problèmes de caractères spéciauxProblemes d erreurs en ADA pour un devoir à rendre Help
Problemes d erreurs en ADA pour un devoir à rendre HelpProblèmes de cookies avec IE mais pas Firefox
[CSS] Mac : Problèmes divers - PART II : IE Mac et les marges[PHP] Une petite précision sur date()
Problèmes de création de noeud avec JavaCC[Visual C++]Problèmes d'affichage d'images
Plus de sujets relatifs à : problèmes de précision


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR