为什么定点比例因子往往是 2 的幂?
Why does a fixed-point scaling factor tend to be a power of two?
假设我们有两个浮点值: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 的幂无法快速计算。
是吗?我们基本上会因为一点延迟(如果有的话)而破坏精度?
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) 之间的差异将继续主导而不是切换到十进制浮点数。
假设我们有两个浮点值: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 的幂无法快速计算。
是吗?我们基本上会因为一点延迟(如果有的话)而破坏精度?
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) 之间的差异将继续主导而不是切换到十进制浮点数。