我使用长双人的方式有什么问题吗?

Cyb*_*orm 5 c++

我最近对学习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;
}
Run Code Online (Sandbox Code Playgroud)

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

123.45678710937500000000
Size of float: 4
123.45678900000000000000
Size of double: 8
123.45678900000000000000
Size of long double: 16
Run Code Online (Sandbox Code Playgroud)

这是我的实际输出:

123.45678710937500000000
Size of float: 4
123.45678900000000000000
Size of double: 8
-6518427077408613100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000000
Size of long double: 12
Run Code Online (Sandbox Code Playgroud)

关于发生的事情的任何想法将非常感谢,谢谢!

编辑:

System:
Windows 10 Pro Technical Preview
64-bit Operating System, x64-based processor
Eclipse CDT 8.5
Run Code Online (Sandbox Code Playgroud)

MinGW安装

Mor*_*haw 6

早期版本中修复此问题补丁:

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

当我使用MinGW-get(它提供的最新版本)的4.8.1版本4时,这个错误发生在我身上,但是当我使用4.8.1版本5时却没有.

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

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

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

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

最后,你甚至可以double在你试图打印出来的时候投入到一个long double(有一些准确性的损失,但是只打印数字时无关紧要).

要查找更多详细信息,您还可以查看我在此问题上的博客文章.

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