这是我在 Windows 8.1 64 位 (gcc-5.1.0-tdm-1-core) 上使用 TDM-GCC 5.1 32bit (gcc-5.1.0-tdm-1-core) 编译的简单 C++ 代码strong>英特尔酷睿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 找到它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
,因此可以正常运行。
关于c++ - 为什么 std::sqrt() 在 C++ 中对 double 据不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34017603/