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

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

本文关键字:不能 正确处理 数据 C++ std sqrt 为什么      更新时间:2023-10-16

这是一个C++中的简单代码,我正在Windows 8.164位Intel core 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位编译器一起正常工作。

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

这里怎么了?

问题如下:

它是在代码中固有地编译的::具有以下命令的块(缩小):

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

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

因此,在将-lm-L"C:Program Files (x86)GnuWin32lib"一起放置时,使用Process Explorer发现main.exe正在使用似乎不兼容的相应旧的libm5.dll

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

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

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

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

它没有链接旧的CCD_ 5并且因此正确地运行。