c++ - 为什么 std::sqrt() 在 C++ 中对 double 据不能正常工作?

标签 c++ windows double sqrt tdm-gcc

这是我在 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 找到它ma​​in.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/

相关文章:

c++ - C++中的基本整数解释

windows - 如何在 powershell 中创建一个简短但仍然唯一的目录名称

c++ - Visual Studio (VC++ 2005) 调试内存

windows - 将 Delphi 代码移植到 64 位 - 为什么没有编译器警告?

c# - 是否可以写出一个 C# double 并用 Java 读取它?

c++ - 库无法正确导出功能

c++ - cmake:在安装时执行cmake命令

c++ - 如何优化随机排序算法?

iphone - ios 游戏中心提交时间并在排行榜中显示

arrays - 将 2D 矩阵的 2D 单元(大小一致)转换为 4D matlab double