【发布时间】:2021-08-19 06:21:27
【问题描述】:
假设我们有两个浮点值:1.23 和 4.56。
要在不支持浮点的机器中表示和添加这些,我们将不得不回退到定点表示。
所以我们选择数字100作为比例因子,只是为了去掉小数点:
1 - 按比例因子将它们倍增 => 123 和 456
2 - 添加他们123 + 456 = 579
3- 除以相同的比例因子 => 5.79
等于浮点数加1.23 + 4.56 = 5.79
现在,为什么我一直在阅读有关比例因子往往是 2 次方的在线文章?
https://en.wikipedia.org/wiki/Scale_factor_(computer_science)
如果我选择 2^5 = 32 作为我的比例因子,那么我们有:
-> 1.23 * 32 = 39.36 ~= 39
-> 4.56 * 32 = 145.92 ~= 145
-> 39 + 149 = 188
-> 188 / 32 = 5.87
5.87 的输出甚至都不精确。那么为什么我们选择2的幂呢?
我们为什么不直接选择 10 的幂作为因数?
编辑
我也看到过这样的帖子: https://spin.atomicobject.com/2012/03/15/simple-fixed-point-math/
之所以选择 2 的幂,是因为计算机可以快速表示它们,即 2^16 可以通过位移 : 1 << 16 来完成,但 10 的幂无法快速计算。
是这样吗?我们基本上会因为一点延迟(如果有的话)而破坏精度?
【问题讨论】:
-
这样想:不是 1 + 2/10 + 3/100,而是 1 + 1/2 + 1/8。
-
使用二进制与十进制不会“破坏精度”。您给出的示例中的准确性丢失有两个原因:第一,在二进制样本中,您使用的比例因子(32)比十进制样本(100)小得多。二,您的样本中的数字完全可以用十进制表示。这种十进制数字仅在人类已经将数字四舍五入或以这种方式创建它们的情况下才常见。它们在自然界中并不经常出现——⅓ 不能精确地用十进制表示,物体的质量和速度永远不会或几乎永远不会是克或 m/s 的十进制数。
-
对数学和物理中出现的数字的一般分布使用十进制定点会产生舍入误差,就像二进制定点一样。
-
@EricPostpischil 谢谢,所以本质上,二进制选择 2 的幂的原因是因为使用位移计算变得更快?
-
@Dan:是的。我会发布一个答案,但现在必须出去,并想考虑是否还有其他原因。
标签: floating-point ieee-754 fixed-point