gnu c ++浮点数精度

时间:2012-03-01 22:28:22

标签: c++

我有关于浮点数的简单问题,

double temp;  
std::cout.precision(std::numeric_limits<double>::digits10);
temp = 12345678901234567890.1234567890;
std::cout << (temp < std::numeric_limits<double>::max()) << std::endl;
std::cout << std::fixed << std::endl;
std::cout << temp << std::endl;

然而,我得到的输出就是这个,

1
12345678901234567168.000000000000000

temp的值仍然在double的范围内,但是,值完全不同。我想知道我在这里做错了什么?

感谢。

4 个答案:

答案 0 :(得分:5)

double只有15.95个十进制数字的精度。您已经超过了值的整数部分中的这个位数,因此最后几位数字的精度损失,小数点后缺少任何有用的数字。

在使用浮点值进行更多工作之前,您应该先看一下:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

答案 1 :(得分:3)

这并不完全不同。这是正确的16位左右。这是关于double的预期结果。

答案 2 :(得分:0)

双倍只能存储有限的精度。它可以达到大约15位小数。

这是一篇有关如何表示浮点数的有用文章,以及该表示的含义: Float

答案 3 :(得分:0)

IEEE 754对于任何给定值都不准确 - 例如http://www.cprogramming.com/tutorial/floating_point/understanding_floating_point.htmlhttp://support.microsoft.com/kb/42980

根据{{​​3}},

-358974.27无法在float上显示,我记得(虽然我懒得测试),即使像2.2或2.3这样的“简单”也不能即使是double,也要准确表示。