【发布时间】:2014-04-06 20:26:52
【问题描述】:
说我有:
float a = 3 // (gdb) p/f a = 3
float b = 299792458 // (gdb) p/f b = 299792448
然后
float sum = a + b // (gdb) p/f sum = 299792448
我认为这与尾数移动有关。有人可以准确解释发生了什么吗? 32位
【问题讨论】:
-
如果这是一个精度限制问题,您可能想尝试从浮点数更改为双精度数。记住,浮动四舍五入;如果您不希望这种行为,请坚持使用整数或长整数或使用扩展精度包之一。
-
所以,我问的是四舍五入的机制
-
想象浮点数是基于十位的,尾数只有三位数。那么 99900 就是 999*10^2。现在添加 3:99903。但尾数很短 -> 舍入。基于 2 的情况也是如此,但我们现在也看到了对转换的奇怪影响,因为我们以十进制打印。
-
这里你有一个关于发生了什么的详细解释,或者换句话说,一个浮点数是如何存储到 32 位中的。 en.wikipedia.org/wiki/Single-precision_floating-point_format
-
相关:Why adding big to small in floating point introduce more error? 用于类似情况,舍入误差与较小的操作数相比较大,但不等于它。
标签: c floating-point