Floating point 为什么定点比例因子往往是二的幂?

Floating point 为什么定点比例因子往往是二的幂?,floating-point,ieee-754,fixed-point,Floating Point,Ieee 754,Fixed Point,假设我们有两个浮点值:1.23和4.56。 要在没有浮点支持的机器中表示和添加这些,我们必须回到定点表示 因此,我们选择数字100作为比例因子,只是为了排除小数点: 1-按比例因子乘以它们=>123和456 2-添加它们123+456=579 3-除以相同的比例因子=>5.79 等于浮点加法1.23+4.56=5.79 现在,为什么我一直在网上阅读比例因子往往是二的幂的文章 如果我选择say2^5=32作为我的比例因子,那么我们有: -> 1.23 * 32 = 39.36 ~= 39

假设我们有两个浮点值:
1.23
4.56
。 要在没有浮点支持的机器中表示和添加这些,我们必须回到定点表示

因此,我们选择数字100作为比例因子,只是为了排除小数点:

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

2-添加它们
123+456=579

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

等于浮点加法
1.23+4.56=5.79

现在,为什么我一直在网上阅读比例因子往往是二的幂的文章

如果我选择say
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的幂作为因子呢

编辑 我在这些帖子中也看到:

选择二的幂是因为计算机可以快速地表示它们,也就是说,
2^16
可以通过位移位来完成:
1
等于浮点加1.23+4.56=5.79

不完全是

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

为什么我一直在网上阅读比例因子往往是二的幂的文章

对于二进制浮点,按2的幂进行缩放不会造成精度损失。该产品与其预标度值完全相同

我们为什么不选择10的幂作为因子呢

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

是这样吗?我们基本上破坏了一点延迟的精度(如果有的话)


不,还有很多问题。由于问题太多,速度也很重要,浮点硬件制造商需要一个特别的IEEE-754。即使在40年后,角落案件也会出现。在过去20年中,IEEE-754的十进制版本也存在。整个规范的这一部分正在放缓在硬件而不是Sloow软件十进制浮点实现中的实现。在市场被广泛接受之前,二进制浮点及其与经典数学(1.23+4.56)之间的差异将继续占主导地位,而不是转换为十进制浮点。

这样想:你要处理的不是1+2/10+3/100,而是1+1/2+1/8。使用二进制与十进制相比不会“破坏精度”. 在您给出的示例中,由于两个原因导致精度下降:第一,在二进制样本中,您使用的比例因子(32)比在十进制样本中使用的比例因子(100)小得多。第二,你的样本中的数字完全可以用十进制表示。只有在人类已经将数字四舍五入为十进制或以这种方式创建数字的情况下,这种十进制数字才很常见。它们在自然界中并不经常出现-⅓ 不能精确地用十进制表示,物体的质量和速度从来都不是或几乎从来都不是十进制的克数或米/秒数。在数学和物理中使用十进制定点表示数字的一般分布将产生舍入误差,正如二进制定点将产生舍入误差一样。@EricPostchil谢谢,所以本质上,在二进制中选择2的幂是因为使用位移位可以加快计算速度?丹:是的。我会发布一个关于这个问题的答案,但是现在我不得不离开,我想考虑一下是否还有其他原因。谢谢,你是如何选择比例因子的?本质上是“越多越好”吗?还假设我们有N个位用于显示一个固定点。是否可以使用定点显示该范围内的每个小数点?或者,不管我们有多少位,小数是无法表示的?例如,我已经知道十分之一(0.1)和百分之一(0.01)只能表示为大约。@Dan要使用多少位?:需要知道要编码的最大固定点值,以及需要的精度。e、 g.(log2(所需的最大值/预设值)+1表示符号)。如果没有足够的位可用,就必须给出一些信息。我知道,在问题的第二部分,我们能用定点显示给定范围内的每个小数点吗?或者总有无法表示的数字?@Dan如果定点是用整数类型实现的:是,如果是二进制FP类型:否。@Dan 0.01按100缩放并保存为定点整数是100。按/100,0.01的比例缩小,可以精确地生成文本。0.01(可能是文本)按100缩放并保存为二进制FP为100.0。缩小比例(双精度/100),
double
商约为
0.0100000000002081…
。当然,当打印出来时,这四舍五入为几位小数,即
0.01
,但商并不完全是0.01。