这是为什么回来的楠

Why is this returning nan?

本文关键字:回来 为什么      更新时间:2023-10-16

代码:

double v = (180*9.8)/(42*42);  // v should be 1.000000
printf("%f ",v);
cout<<asin(v);

输出:

1.000000
nan

我正在使用64位mingw(赢7(。

这是因为v大于1(当使用双精度浮点计算(180*9.8(/(42*42(时(。

double v = (180*9.8)/(42*42); 
std::cout.precision(20);
cout << fixed << v << endl;

输出:

1.00000000000000022204
nan

演示

要解决有限精度的问题,可以执行以下操作。

if (v > 1)
    v = 1;
if (v < -1)
    v = -1;

9.8是一个不能用浮点精确表示的值。也就是说,存储的实际值等于9.8 + delta,其中delta是一个小值,可以是正的也可以是负的。

如果delta对您的浮点表示(可能是IEEE(是正的,那么180*9.8将大于1764,因此v的值将超过1asin()的唯一有效输入在-11的范围内。尽管没有为超出该范围的值指定asin()的返回值,但NaN是报告该值的一种方式。