为什么std::sqrt()在C++中不能正确处理双数据
Why does not std::sqrt() work correctly on double data in C++?
这是一个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并且因此正确地运行。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么我的for循环不能正确获取argv
- Clang-Format 不能正确分配函数参数
- 为什么相应成员不能正确访问成员函数指针
- 为什么 CSpinButtonCtrl 不能正确处理大于 1000 的数字?
- STD ::在C 中的进步不能正确地行为
- 为什么UINT64_T不能正确显示POW(2,64)-1
- 为什么函数不能正确强制转换指针(从基类到派生类)
- 为什么我的可变参数宏不能正确接受任何参数?
- 为什么 g++ 不能正确链接到指定的 -L 路径?
- 为什么我的 qt centralWidget(一个 QGLWidget)不能正确调整大小?
- 双精度不能正确减去小数
- Doxygen不能正确确定返回类型
- 为什么std::sqrt()在C++中不能正确处理双数据
- C++armadillo不能正确求解条件较差的矩阵
- 为什么无符号字符不能正确显示十六进制值
- 为什么swig在使用__getattribute__时不能正确处理AttributeError ?
- Vector和String的Structs不能正确打印
- 套接字在多线程服务器中不能正确接受
- c++的新功能,scanf不能正确读取/打印输入