我使用 long double 的方式有问题吗?

2023-12-07

我最近对学习 C++ 编程感兴趣,因为我想更深入地了解计算机的工作和处理指令的方式。我想我会尝试一下数据类型,但我真的不明白我的输出发生了什么......

#include <iostream>
#include <iomanip>

using namespace std;

int main() {

    float fValue = 123.456789;
    cout << setprecision(20) << fixed << fValue << endl;
    cout << "Size of float: " << sizeof(float) << endl;

    double dValue = 123.456789;
    cout << setprecision(20) << fixed << dValue << endl;
    cout << "Size of double: " << sizeof(double) << endl;

    long double lValue = 123.456789;
    cout << setprecision(20) << fixed << lValue << endl;
    cout << "Size of long double: " << sizeof(long double) << endl;

    return 0;
}

我预期的输出会是这样的:

123.45678710937500000000
Size of float: 4
123.45678900000000000000
Size of double: 8
123.45678900000000000000
Size of long double: 16

这是我的实际输出:

123.45678710937500000000
Size of float: 4
123.45678900000000000000
Size of double: 8
-6518427077408613100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000000
Size of long double: 12

任何关于发生的事情的想法将不胜感激,谢谢!

Edit:

System:
Windows 10 Pro Technical Preview
64-bit Operating System, x64-based processor
Eclipse CDT 8.5

MinGW Installation


来自在早期版本中修复此问题的补丁:

MinGW 使用 Microsoft 运行时 DLL msvcrt.dll。这里存在一个问题:虽然 gcc 创建 80 位长双精度数,但 MS 运行时仅接受 64 位长双精度数。

当我使用 MinGW-get(它提供的最新版本)的 4.8.1 修订版 4 时,会发生此错误,但当我使用 4.8.1 修订版 5 时,不会发生此错误。

所以你没有使用 long double 错误(尽管会有更好的准确性)long double lValue = 123.456789L以确保它不会将 123.456789 作为双精度数,然后将其转换为长双精度数)。

解决此问题的最简单方法是将您正在使用的 MinGW 版本更改为 4.9 或 4.7,具体取决于您的需要(您可以获得 4.9here).

如果您愿意改用 printf,则可以更改为printf("%Lf", ...),以及:

  • 使用 g++ 编译时添加标志 -posix
  • add #define __USE_MINGW_ANSI_STDIO 1 before #include <cstdio>(从原始补丁)

最后,您甚至可以直接投射到double每当您尝试打印出long double(准确性会有所损失,但仅打印数字时应该不重要)。

要了解更多详细信息,您还可以查看我关于这个问题的博客文章.

更新:如果你想继续使用Mingw 4.8,你也可以downloadMignw 的另一个发行版,对我来说没有这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我使用 long double 的方式有问题吗? 的相关文章

随机推荐