为什么这回归南?

goe*_*ash 0 c++ nan c++11

码:

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

输出:

1.000000
nan
Run Code Online (Sandbox Code Playgroud)

我正在使用64位mingw(赢7).

911*_*911 5

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

double v = (180*9.8)/(42*42); 

std::cout.precision(20);

cout << fixed << v << endl;
Run Code Online (Sandbox Code Playgroud)

输出:

1.00000000000000022204
nan

DEMO

为了摆脱有限精度的问题,可以在下面做.

if (v > 1)
    v = 1;
if (v < -1)
    v = -1;
Run Code Online (Sandbox Code Playgroud)