浮点非常态,无关紧要但有争议

非正规浮点数和逐渐下溢是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之间的空白。这些是无法数。它们需要稍微不同的格式来表示,需要稍微不同的硬件来处理。

IEEE浮点数委员会

IEEE浮点委员会于1977年在硅谷成立。与会者包括半导体制造商的代表,他们当时正在开发芯片,这些芯片后来成为了我们今天非常熟悉的个人电脑的基础。正如我在上一篇文章中所说,该委员会是竞争对手之间合作的一个非凡案例。Velvel Kahan是委员会会议上最引人注目的人物。他不仅是加州大学伯克利分校的数学和计算机科学教授,他还是英特尔的顾问,并参与了他们的数学协处理器8087的设计。Velvel的一些学生,不仅在校园里,还有已经毕业并在一些参与项目的公司工作的学生,都参与了其中。由Kahan、他在伯克利的学生Jerome Coonen和伯克利的客座教授Harold Stone共同起草的标准草案反映了英特尔的设计,是委员会大部分工作的基础。该委员会经常开会,通常是在晚上,地点是旧金山半岛各公司的会议室。在德克萨斯州的奥斯汀和东海岸也有会议。会议经常持续到午夜过后很久。 Membership was based on regular attendance. I was personally involved only when I was visiting Stanford, so I was not an official member. But I do remember telling a colleague from Sweden who was coming to the western United States for the first time that there were three sites that he had to be sure to see: the Grand Canyon, Las Vegas, and the IEEE Floating Point Committee.

争议

KCS草案中的非常态对委员会的大多数人来说都是新鲜事物。Velvel说他在多伦多大学做过实验,但仅此而已。标准的努力旨在规范现有的实践,而不是引入新的设计。此外,实现非法线需要额外的硬件,而额外的晶体管在新兴设计中是一种宝贵的资源。一些专家声称,包括非法数会减慢所有浮点运算的速度。来自DEC的数学家玛丽·佩恩(Mary Payne)带头反对KCS。DEC想要一个更宽松的标准,可以包含已经在他们的VAX上可用的浮点数。VAX格式与KCS提案相似,但并不相同。它不包括无法无天。讨论持续了几年。 Letters of support for KCS from Don Knuth and Jim Wilkinson did not settle the matter. Finally, DEC engaged G. W. (Pete) Stewart, from the University of Maryland. In what must have been a surprise to DEC, Pete also said he thought that the KCS proposal was a good idea. Eventually the entire committee voted to accept a revised version.

Denormals今天

非常规浮点数在今天的浮点家族中仍然是不受欢迎的继子。我认为,可以公平地说,数值分析界未能就其重要性提出强有力的论据。的确,它们确实使一些浮点误差分析更加优雅。但是当震级在$10^{-308}$左右时,双精度非法线在实际计算中几乎没有数值意义。只有$10^{-38}$附近的单精度非法线是潜在重要的。在MATLAB本身之外,我们遇到过具有IEEE浮点数格式的处理器,但在处理时不符合754标准。这些处理器通常会将底流清除为零,因此我们可以预期,对于任何通常可能产生非法线的计算,都会得到不同的数值结果。我们今天仍然看到处理器用微码或软件处理无法线。在这样的处理器上,遇到非法线的MATLAB程序的执行时间会显著降低。维基百科上关于非正常值的页面有一些宏,用于在C或Java程序中设置陷阱处理程序以将下流刷新为零。 I hate to think what might happen to MATLAB Mex files with such macros. Kids, don't try this at home.

参考文献

威廉·卡亨主页.查尔斯•遣散费浮点运算老人访谈录,回忆IEEE计算机1998年2月20日。维基百科页面,Denormal数量

发布与MATLAB®R2014a
|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。