为什么 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
,因此 运行 正确。
这是一个简单的 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
,因此 运行 正确。