我有关于浮点数的简单问题,
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的范围内,但是,值完全不同。我想知道我在这里做错了什么?
感谢。
答案 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.html和http://support.microsoft.com/kb/42980
根据{{3}}, -358974.27无法在float
上显示,我记得(虽然我懒得测试),即使像2.2或2.3这样的“简单”也不能即使是double
,也要准确表示。