如果您在 wikipedia 和其他地方进行一些查看,您将了解到浮点标准(有不同的标准,IEEE754 是最广为人知的,因为它用于台式机等(dsp 将有他们的有时自己计算速度更快))将“标准化”数字。浮点数是关于小数点的位置,非浮点整数在数字右侧有一个隐含的小数点
00111111010000000000000000000000. <--- here
除了要归一化的全零之外,假设我们使用的格式希望数字是二进制的 1.xxxx,所以我们需要移动小数点
001.11111010000000000000000000000
小数位被移到了最重要的位之后(因此小数点左侧只有一个 1)。
如果你记得高中数学中的 123 可以写成 1.23 * 10^2(10 的 2 次方)。 123 也是 123 * 10^0。在以 10 为底的数字中,小数点左移的每一位都会将 10 的幂增加一。右边的每个位置都会减少。以 2 为底的二进制没有什么不同,小数点向左移动的每一位都会增加 2 的幂(二进制是以 2 为底的)每向右移动一个位置,就会减少 2 的幂。
所以准确地说,我们现在的数字是
1.1111101 * 2^30
现在浮点格式的细节开始发挥作用。因为假设小数点左边的 1(除了确切的数字零和其他一些例外)存在,它有时不在该浮点数的最终二进制表示中,这是浪费空间当我们可以为尾数多放一点时,我们知道总是放一点。尾数通常是二进制中所见即所得的,指数是让你摸不着头脑的那个,尤其是 IEEE754。例如,数字的二进制格式中的 128 的指数可能表示 2 的 0 次幂,而 129 可能是 2 的 1 次幂,依此类推。这可能看起来很奇怪,但对于其中一些格式来说,它只不过是一个二进制补码字段,而另一些则有其他方式来做事。单、双、扩展的指数具有不同的位数,您需要弄清楚您添加到实际指数(在本例中为 30)的内容,以获得浮点数的指数字段中的位模式。
另一个例子
0000000000000000000000000000000000000101
会
1.01 * 2^2
如果您从 32 位整数(不是浮点数)开始并希望以 32 位浮点数结束,您显然无法保留该数字的所有细节,因为浮点数需要一个符号位和一个指数和尾数一样,尾数小于 32 位,所以你扔掉了最低有效位
1000000000000000000000000000001
会在某个时候被砍掉:
1.000000000000000 * 2^something