J'ai trouvé un problème de virgule flottante intéressant. Je dois calculer plusieurs racines carrées dans mon code, et l'expression est comme ceci:sqrt (1.0 - pow (1.0.2)) renvoie -nan
sqrt(1.0 - pow(pos,2))
où pos va -1,0 à 1,0 dans une boucle. Le -1.0 est bon pour pow, mais quand pos = 1.0, j'obtiens un -nan. Faire des tests, en utilisant gcc 4.4.5 et 12.0 cpi, la sortie de
1.0 - pow(pos,2) = -1.33226763e-15
et
1.0 - pow(1.0,2) = 0
ou
poss = 1.0
1.0 - pow(poss,2) = 0
Si bien le premier va donner des problèmes, être négatif. Quelqu'un sait pourquoi pow renvoie un nombre inférieur à 0? Le plein code incriminé est ci-dessous:
int main() {
double n_max = 10;
double a = -1.0;
double b = 1.0;
int divisions = int(5 * n_max);
assert (!(b == a));
double interval = b - a;
double delta_theta = interval/divisions;
double delta_thetaover2 = delta_theta/2.0;
double pos = a;
//for (int i = 0; i < divisions - 1; i++) {
for (int i = 0; i < divisions+1; i++) {
cout<<sqrt(1.0 - pow(pos, 2)) <<setw(20)<<pos<<endl;
if(isnan(sqrt(1.0 - pow(pos, 2)))){
cout<<"Danger Will Robinson!"<<endl;
cout<< sqrt(1.0 - pow(pos,2))<<endl;
cout<<"pos "<<setprecision(9)<<pos<<endl;
cout<<"pow(pos,2) "<<setprecision(9)<<pow(pos, 2)<<endl;
cout<<"delta_theta "<<delta_theta<<endl;
cout<<"1 - pow "<< 1.0 - pow(pos,2)<<endl;
double poss = 1.0;
cout<<"1- poss "<<1.0 - pow(poss,2)<<endl;
}
pos += delta_theta;
}
return 0;
}
Je ne sais pas si [ce] (http://docs.sun.com/source/ 806-3568/ncg_goldberg.html "Ce que tout scientifique informatique devrait savoir sur l'arithmétique en virgule flottante") est d'intérêt – Default