单精度浮点上的第24个小数位在哪里? IEEE 754
我今天发现自己做了一些操作,并决定稍微刷新我的浮点知识!
在我看到这件事之前,情况很好:
...有效数的23个小数位以内存格式出现,但总精度为24位
我一遍又一遍地读了一遍,但我仍然无法弄清楚第24位是什么,我注意到了一些关于binary point
东西,所以我认为这是位于mantissa
和exponent
之间的中间点。
我不太确定,但我相信他的作者正在谈论这一点:
Binary point?
|
s------e-----|-------------m----------
0 - 01111100 - 01000000000000000000000
^ this
由于归一化,第24位是隐含的。
有效位被左移(对于每个位移,从指数中减去一位),直到有效位的前导位为1。
然后,由于前导位是1,所以实际上只存储其他23位。
还有一个非常规数字的可能性。 指数存储为一个“偏差”格式的有符号数,这意味着它是一个无符号数,其中范围的中间被定义为0
1。因此,有8位,它存储为0到255之间的数字,但是0被解释为意味着-128,128被解释为意味着0,并且255被解释为127(我可能在那里有fencepost错误,但你明白了)。
如果在归一化过程中这个值减小到0(意味着实际的指数值为-128),则标准化停止,并且有效数据按原样存储。 在这种情况下,来自标准化的隐含比特取为0而不是1。
大多数浮点硬件被设计为基本上假设数字将被标准化,因此他们假设隐式位是1.在计算期间,他们检查非常规数字的可能性,并且在这种情况下,它们大致相当于抛出一个例外,并重新开始计算并考虑到这一点。 这就是为什么非规范计算经常会比其他方法慢得多。
通常(赦免双关语),浮点数的首位总是1; 因此,它不需要存储在任何地方。 原因是,如果它不是1,那就意味着你选择了错误的指数来表示它; 通过将尾数位左移并使用更小的指数,可以获得更高的精度。
一个例外是反正规/次正规数字,它由指数字段中的全零位(可能的最低指数)表示。 在这种情况下,尾数中没有隐含的前导1,并且随着该值接近零,您的精度会降低。
对于正常的浮点数,存储在浮点变量中的数字是(忽略符号) 1. mantissa * 2
exponent-offset
。 前导1不存储在变量中。
上一篇: Where's the 24th fraction bit on a single precision float? IEEE 754