GCC C/C++双重行为[重复]

Posted

技术标签:

【中文标题】GCC C/C++双重行为[重复]【英文标题】:GCC C/C++ double behavior [duplicate] 【发布时间】:2012-05-25 06:41:18 【问题描述】:

可能重复:C++ double precision and rounding off

代码:

int main(void)

    double a = 12;
    double b = 0.5;
    double c = 0.1;

    std::cout.precision(25);
    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << c << std::endl;
    std::cout << a + b << std::endl;
    std::cout << a + c << std::endl;

    return 0;

输出:

12
0.5
0.1000000000000000055511151
12.5
12.09999999999999964472863

为什么 GCC 代表 0.1 和 0.5 不同?添加时,它们的表示方式不同。似乎 0.5 和整数 a 的表示方式与其他浮点数不同。或者这只是 io 库中发生的事情? 是什么导致了这种行为?

【问题讨论】:

related. 双精度不是无限的。您分配的值不能完全使用双精度表示。 我已经澄清了我的问题。这与精度无关。 是的。 0.1 用于浮点编码,与 1/3 用于十进制编码相同。这是一个无限的数字系列。你只有 53 个二进制数字(据我所知),归结为大约 18 个十进制数字。请阅读下面介绍的论文。它有帮助。 @iammilind:“C++ 双精度”不是重复的。那个提问者想要控制四舍五入,而这个提问者在问为什么他没有得到确切的答案。这就是说,我确信我已经看到通过“每个计算机科学家应该了解的浮点运算知识”的链接回答的问题,而且这些问题可能是重复的。 【参考方案1】:

正如具有有限位数的十进制数只能精确表示为 10 的幂和的数字一样,二进制浮点数只能精确表示为 2 的幂和的数字。

在这种情况下,0.1 不能表示为 2 的幂的有限和,而 0.512 可以(0.5 等于 2-1 和 @ 987654325@ 等于 23 + 22)。

再举一个例子,0.75也可以用二进制浮点数精确表示,因为它可以表示为2-1 + 2-2

【讨论】:

【参考方案2】:

0.1 不能用二进制精确表示,因为它不是 2 的幂,必须用一个非常、非常、非常接近的数字来表示。这就是为什么教导学生在比较浮点数时永远不要使用== 运算符,而银行应用程序几乎总是将钱存储为两个整数,即美元金额和便士数量。

【讨论】:

当然。但这可能让我得出我的答案。 0.5 的存储方式不同吗?这真的是我的问题。有时代码不足以表达你的乐趣。【参考方案3】:

这些问题的默认答案:

What every computer scientist should know about floating-point arithmetic

基本上,这是浮点编码的不准确性。你有大约 17 个有效数字,做算术运算会减少它们。

【讨论】:

我已经澄清了我的问题。这与精度无关。 Reader-friendly 同一篇文章的版本。【参考方案4】:

阅读本文

http://floating-point-gui.de/

【讨论】:

以上是关于GCC C/C++双重行为[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将值传递给函数时,GCC前缀增量运算符行为不端[重复]

双重比较的C ++非常奇怪的行为[关闭]

IBM XL C/C++ 等效于#pragma GCC 优化

双重或浮动比较[重复]

为啥 gcc -O1 的行为与 gcc -O0 + 选项不同

gcc 内联汇编行为异常