为什么 std::sqrt() 在 C++ 中不能正确处理双精度数据?

Why does not std::sqrt() work correctly on double data in C++?

这是一个简单的 C++ 代码,我在 [=31] 上使用 TDM-GCC 5.1 32 位 (gcc-5.1.0-tdm-1-core) 编译=] 8.1 64位英特尔酷睿i-7机器

#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 位编译器一起正常工作

此外,当我将数据类型更改为 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 的旧数学库.

因此,将 -lm-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,因此 运行 正确。