Я нашел интересную проблему с плавающей точкой. Я должен вычислить несколько квадратных корней в моем коде, и выражение выглядит так:sqrt (1.0 - pow (1.0,2)) возвращает -nan
sqrt(1.0 - pow(pos,2))
, где позиция идет от -1,0 до 1,0 в цикле. -1.0 отлично подходит для pow, но когда pos = 1.0, я получаю -nan. Делая некоторые тесты, с помощью GCC 4.4.5 и КМК 12.0, выход
1.0 - pow(pos,2) = -1.33226763e-15
и
1.0 - pow(1.0,2) = 0
или
poss = 1.0
1.0 - pow(poss,2) = 0
Где ясно первый один будет давать проблемы, будучи отрицательным. Кто-нибудь знает, почему pow возвращает число меньше 0? Полный код обижая ниже:
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;
}
Не знаю, если [это] (http://docs.sun.com/source/ 806-3568/ncg_goldberg.html «Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой») представляет интерес – Default 2010-12-15 18:47:56