我正在尝试调试以下代码
result = 30 / 1000000000.0
rst = result * 1000000000
cout << "rst:" << rst << endl;
但是,当我试图用eclipse悬停在“rst”变量上来检查值时,eclipse会显示值为29.99999999999 ... 6。但是在cout控制台上打印的值是30.为什么会发生这种情况?在这种情况下,程序将采取哪个变量来进一步继续?
答案 0 :(得分:0)
实际上,两者都没有给出rst
中存储的二进制值的精确十进制表示。
cout
的输出是四舍五入的,Eclipse中的值是舍入/截断的,或者是存储在浮点变量中时会产生相同位模式的值。
我不知道IEEE浮点计算的确切规则,但由于浮点数的精度有限,任何二进制数(至少有一个小数位)的精确十进制表示必须最后用五个作为1/2 ^ n总是类似于0. ... 5对于任何n&gt; = 0。
首先,这意味着30 / 1000000000.0的精确结果无法通过任何浮点类型(甚至不是双精度)准确表示,因此,30 / 1000000000.0 * 1000000000.0不是标识操作。 (这与例如在十进制系统中将1除以3的问题相同)
其次,这也意味着29.99999999999 ... 6 不能是rst中存储的任何内容的精确十进制表示。