浮点非常态,无关紧要但有争议
非正规浮点数和逐渐下溢是IEEE浮点标准的一个未被重视的特性。双精度非法线是如此之小,以至于它们很少具有数值意义,但单精度非法线可能会影响一些原本不显著的计算。从历史上看,在制定标准的委员会审议过程中,逐渐的底流被证明是非常有争议的。
内容
规范化浮点数
我之前的文章主要是规范化的浮点数。回想一下,规范化的数字可以表示为$$ x = \pm (1 + f) \cdot 2^e $$ The分数或尾数$f$满足$$ 0 \leq f < 1 $$ $f$必须可以用二进制表示,对于双精度最多使用52位,对于单精度最多使用23位。指数$e$是区间$$ -e_{max} < e \leq e_{max} $$的整数,其中$e_{max} = 1023$用于双精度,$e_{max} = 127$用于单精度。$f$的有限性是对的限制精度.$e$的有限性是对的限制范围.任何不满足这些限制的数字都必须用满足这些限制的数字来近似。浮点格式
双精度浮点数存储在64位字中,$f$为52位,$e$为11位,数字的符号为1位。$e$的符号通过存储$e+e_{max}$来容纳,它介于$1$和$2^{11}-2$之间。单精度浮点数存储在一个32位字中,$f$为23位,$e$为8位,数字的符号为1位。$e$的符号通过存储$e+e_{max}$来容纳,它介于$1$和$2^{8}-2$之间。指数场的两个极值,全为0和全为1,是特殊情况。全0表示一个非正浮点数,这就是今天文章的主题。所有的1,加上一个零分数,表示无穷大,或者正.所有的1,加上一个非零分数,表示非a数,或者南.floatgui
我的程序floatgui,可以在这里,表示变参数模型浮点系统中正数的分布。参数$t$指定用于存储$f$的比特数,因此$2^t f$是一个整数。参数$e_{min}$和$e_{max}$指定指数的范围。零左右的差距
如果您仔细查看的输出floatgui所示上一篇文章你会看到一个零左右的差距。这在对数图中尤其明显,因为对数分布永远不可能达到零。下面是稍微不同的参数$t = 3$, $e_{min} = -5$和$e_{max} = 2$的输出。然而,零附近的空隙已经被一点绿色填满了。这些是非常态。放大
放大这些玩具浮点数小于1 / 2的部分。现在你可以看到单个的绿色无法线,在这个例子中有8个。非正规浮点数
非正规浮点数本质上是归一化数在下流极限附近的舍入误差,最小正浮点数,即$2^{-e_{max}+1}$。它们是等距的,间隔为eps *最小正浮点数.零自然是最小的非正规数。假设x而且y是两个不同的浮点数,接近但大于,最小正浮点数.很可能是他们的不同,X - y,小于最小正浮点数.例如,在小floatgui上图中的系统,Eps = 1/8而且Realmin = 1/32.的数量X = 6/128而且Y = 5/128之间1/32而且1/16,所以它们都在底流之上。但X - y = 1/128下流产生一个绿色的无法线。在IEEE标准之前,甚至在今天不符合标准的系统上,下流量都会被简单地设置为零。所以有可能得到MATLAB表达式X == y虚情假意,同时表达
X - y = 0是真实的。在下溢刷新为零且除零是致命的机器上,此代码片段会产生除零并崩溃。
如果X ~= y z = 1/(X -y);结束当然,非法数也可以通过乘法和除法产生eps *最小正浮点数而且最小正浮点数.在十进制中这些范围是
格式紧凑的格式短e[eps*realmin] [eps(“单一”) *最小正浮点数(“单一”)最小正浮点数(“单一”)]
Ans = 4.9407e-324 2.2251e-308 Ans = 1.4013e-45 1.1755e-38
Denormal格式
非常规浮点数存储时没有隐含的前导位,$$ x = \pm f \cdot 2^{-emax+1}$$ the分数$f$满足$$ 0 \leq f < 1 $$并且$f$用二进制表示,使用52位双精度和23位单精度。请注意,零自然地以非正规形式出现。当你看一个双精度的非正规十六进制格式情况相当清楚。最右边的13个十六进制字符是分数的52位。前导位是符号。前三个十六进制字符的其他12位都是零,因为它们表示有偏差的指数,这是零,因为$emax$和指数偏差被选择为互补。这是两个最大和两个最小的非零双精度无法线。格式十六进制[(1-eps);(1 - 2 * eps);2 *每股收益;每股收益;0] *最小正浮点数格式长e答
Ans = 000fffffffffffffff 000ffffffffffffe 0000000000000002 0000000000000001 0000000000000000 Ans = 2.225073858507201e-308 2.225073858507200e-308 9.881312916824931e-324 4.940656458412465e-324 0单精度情况稍微复杂一些,因为23不是4的倍数。单个精度浮点数的分数和指数字段(normal或nonnormal)共享十六进制显示的第三个字符中的位;偏置指数得到一位,23位分数的前三位得到另外三位。这是两个最大和两个最小的非零单精度无法线。
格式十六进制E = eps(“单一”);R = realmin(“单一”);[(单电子);(1 - 2 * e);2 * e;e;0] * r格式短e答
Ans = 007fffff 007ffffe 00000002 00000001 00000000 Ans = 1.1755e-38 1.1755e-38 2.8026e-45 1.4013e-45 0从这个角度考虑情况。的右边的规范化浮点数最小正浮点数之间,最小正浮点数而且2 *最小正浮点数,是等距的,间隔为eps *最小正浮点数.如果有同样多的数字,有相同的间距,放在左边最小正浮点数,它们填补了0和0之间的空白。这些是无法数。它们需要稍微不同的格式来表示,需要稍微不同的硬件来处理。
评论
如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。