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.5
和 12
可以(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++双重行为[重复]的主要内容,如果未能解决你的问题,请参考以下文章
IBM XL C/C++ 等效于#pragma GCC 优化