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