为什么定点比例因子往往是 2 的幂?

Why does a fixed-point scaling factor tend to be a power of two?

假设我们有两个浮点值:1.234.56。 要在没有浮点支持的机器中表示和添加这些,我们将不得不退回到定点表示。

所以我们选择数字100作为比例因子,只是为了去掉小数点:

1 - 按比例因子乘以它们 => 123456

2 - 添加它们 123 + 456 = 579

3-除以相同的比例因子=> 5.79

等于浮点数加1.23 + 4.56 = 5.79

现在,为什么我一直在阅读关于比例因子往往是 2 的幂的在线文章?

https://en.wikipedia.org/wiki/Scale_factor_(computer_science)

https://www.allaboutcircuits.com/technical-articles/fixed-point-representation-the-q-format-and-addition-examples/

如果我选择 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 的幂无法快速计算。

是吗?我们基本上会因为一点延迟(如果有的话)而破坏精度?

Which is equal to the floating point add 1.23 + 4.56 = 5.79

不完全是。

1.23、4.56、5.79 作为源代码是完全可以表示的。作为用 binary64 编码的浮点数,它们不是。就像 0.3333 不完全是三分之一一样,IEE-754 二进制使用附近的值 - 在 253 的 1 部分以内。因此,加法 可能 提供预期的总和,或者可能会出现 非常接近 的其他总和。

why do I keep reading on online articles that scaling factor tends to be a power of two?

对于二进制浮点数,按 2 的幂缩放不会注入精度损失。该产品与其预定值完全一样好。

Why don't we just pick a power of 10 as the factor?

按 10 的幂缩放在纸上(经典数学)效果很好,但对于二进制浮点数,乘积可能不精确,而是使用四舍五入的值。因此我们的缩放会注入一个错误。

So is that it? we basically destroy precision for a bit of latency (if at all)?

不,还有很多问题。由于存在如此多的问题并且速度很重要,因此浮点硬件制造商需要一个非常具体的 IEEE-754。即使在 40 年后,角落案例也会出现。在过去的 20 年中,也存在 decimal 版本的 IEEE-754。总体规范的这一部分在硬件中的实现速度正在放缓,而不是 slooooow 软件十进制浮点实现。在市场推动更广泛的接受之前,二进制浮点数与经典数学 (1.23 + 4.56) 之间的差异将继续主导而不是切换到十进制浮点数。