我最近对学习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
答案 0 :(得分:6)
来自patch that fixed this in earlier versions:
MinGW使用Microsoft运行时DLL msvcrt.dll。这有一个问题:当gcc创建80位长的双精度数时,MS运行时只接受64位长的双精度数。
当我使用MinGW-get(它提供的最新版本)的4.8.1修订版4时,我发生了这个错误,但是当我使用4.8.1修订版5时却没有。
所以你没有使用long double wrong(尽管做long double lValue = 123.456789L
会有更好的准确性,以确保它不会将123.456789作为double,然后将其转换为long double)。
解决此问题的最简单方法是将您使用的MinGW版本更改为4.9或4.7,具体取决于您的需求(您可以获得4.9 here)。
如果您愿意改用printf,可以更改为printf("%Lf", ...)
,然后:
#define __USE_MINGW_ANSI_STDIO 1
之前添加#include <cstdio>
(从origional patch找到此内容)最后,每当您尝试打印double
时,您甚至可以转换为long double
(准确度会有所下降,但只需打印出数字就无所谓了)。
要查找更多详情,您还可以查看my blog post on this issue。
更新:如果你想继续使用Mingw 4.8,你也可以download使用不同的Mignw发行版,这对我没有任何问题。