为什么std :: sqrt()不能在C ++中的double数据上正常工作?

这里是一个简单的C ++代码,我正在Windows 8.1 64位英特尔核心i-7机器上使用TDM-GCC 5.1 32位 (gcc-5.1.0-tdm-1-core)进行编译。

#include <iostream> #include <cmath> using namespace std; int main() { double a, b; a = 0.002; b = 0.004; cout << std::sqrt(a*a+b*b)<< endl; return 0; } 

但在运行时,它会提供以下输出

 nan 

但是,它在32位机器上与TDM-GCC 32位编译器正常工作。

此外,当我将数据types更改为float时 ,它在32位和64位计算机上都能正常工作。

这里有什么问题?

问题如下:

它使用以下命令(缩小)在Code :: Blocks中固有编译:

 g++.exe -L"C:\Program Files (x86)\GnuWin32\lib" -o main.exe main.cpp -lm 

其中C:\ Program Files(x86)\ GnuWin32 \ lib有一个名为libm.a的旧数学库。

因此,在-L"C:\Program Files (x86)\GnuWin32\lib" ,使用Process Explorer发现main.exe正在使用相应的旧libm5.dll ,这似乎是不兼容的。

因此,如果至少有一个选项 -lm-L"C:\Program Files (x86)\GnuWin32\lib"删除并编译如下:

 g++.exe -L"C:\Program Files (x86)\GnuWin32\lib" -o main.exe main.cpp 

要么

 g++.exe -o main.exe main.cpp -lm 

要么

 g++.exe -o main.exe main.cpp 

它不链接旧的libm.a ,因此正确运行。