gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:09 26 4
gpt4 key购买 nike

我最近对学习 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

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

编辑:

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

MinGW Installation

最佳答案

来自 patch that fixed this in earlier versions :

MinGW uses the Microsoft runtime DLL msvcrt.dll. Here lies a problem: while gcc creates 80 bits long doubles, the MS runtime accepts 64 bit long doubles only.

当我使用 MinGW-get(它提供的最新版本)的 4.8.1 修订版 4 时,我会遇到这个错误,但当我使用 4.8.1 修订版 5 时,不会出现这个错误。

因此您没有使用 long double 错误(尽管执行 long double lValue = 123.456789L 会更准确,以确保它不会将 123.456789 作为 double ,然后将其转换为 long double)。

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

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

  • 用g++编译时加上标志-posix
  • #define __USE_MINGW_ANSI_STDIO 1 之前添加 #include <cstdio>(从 origional patch 中找到)

最后,您甚至可以在尝试打印出 double 时直接转换为 long double(准确性会有所损失,但仅打印出数字时应该无关紧要)。

要查找更多详细信息,您还可以查看 my blog post on this issue

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

关于c++ - 我使用 long double 的方式有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28523892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com