我发现自己今天做了一些操作,我决定稍微刷新我的浮点知识!
在看到这个之前,事情已经伟大了:
...有效数的23个小数位出现在存储器格式中,但总精度为24位
我一次又一次地读它但是我仍然无法弄清楚第24位的位置,我注意到了binary point
的某些内容所以我认为它是mantissa
之间的中间点和exponent
。
我不太确定,但我相信他的作者正在谈论这一点:
Binary point?
|
s------e-----|-------------m----------
0 - 01111100 - 01000000000000000000000
^ this
答案 0 :(得分:18)
由于归一化,24 th 位是隐含的。
有效数据向左移位(每个位移从指数中减去一个),直到有效数的前导位为1。
然后,由于前导位为1,实际只存储了其他23位。
还有可能存在非正规数。指数存储为“偏差”格式有符号数,表示它是无符号数,其中范围的中间定义为0
1 。因此,对于8位,它存储为0..255的数字,但0被解释为-128,128被解释为0,而255被解释为127(我可能有一个fencepost错误,但是你得到这个想法。
如果在归一化过程中,它递减到0(表示实际指数值为-128),则归一化停止,并且有效数据按原样存储。在这种情况下,从归一化的隐含位取为0而不是1.
大多数浮点硬件的设计基本上假设数字将被标准化,因此它们假设隐含位为1.在计算过程中,它们检查非正规数的可能性,在这种情况下,它们大致相当于抛出异常,并重新开始计算。这就是computation with denormals often gets drastically slower than otherwise。
的原因答案 1 :(得分:5)
通常(原谅双关语),浮点数的前导位始终为1;因此,它不需要存储在任何地方。原因是,如果它不是1,那就意味着你选择了错误的指数代表它;通过将尾数位向左移动并使用较小的指数,可以获得更高的精度。
一个例外是非正规数/次正规数,它由指数字段中的所有零位(最低可能指数)表示。在这种情况下,尾数中没有隐式前导1,并且当值接近零时,精度会降低。
答案 2 :(得分:1)
对于正常浮点数,存储在浮点变量中的数字是(忽略符号)1. mantissa * 2
exponent-offset
。前导1不存储在变量中。