gpt4 book ai didi

c++ - sqrt(1.0 - pow(1.0,2)) 返回 -nan

转载 作者:太空狗 更新时间:2023-10-29 23:29:04 25 4
gpt4 key购买 nike

<分区>

我发现了一个有趣的 float 问题。我的代码要计算几个平方根,表达式是这样的:

sqrt(1.0 - pow(pos,2))

其中 pos 在一个循环中从 -1.0 到 1.0。 -1.0 适用于 pow,但当 pos=1.0 时,我得到一个 -nan。做一些测试,使用 gcc 4.4.5 和 icc 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;
}

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com