为什么std :: sqrt()在C ++中的双数据上没有正常工作?

时间:2015-12-01 10:04:47

标签: c++ windows double sqrt tdm-gcc

这是一个简单的C ++代码,我在Windows 8.1 64bit上使用 TDM-GCC 5.1 32位(gcc-5.1.0-tdm-1-core)进行编译英特尔酷睿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位计算机上都能正常工作。

这里有什么问题?

1 个答案:

答案 0 :(得分:1)

问题如下:

它是使用以下命令(缩小)在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"放在一起时,可以使用进程资源管理器找到 main.exe 正在使用相应的旧< strong> 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因此正确运行。