IEEE 浮点格式为一些特殊的浮点值提供了一种特殊的编码。本节我们将介绍使用这些特殊的浮点值的目的及它们的含义,以及浮点格式表示形式。
通常情况下,浮点数阶码位不会全部为0或全部为1。全1或全0的阶码表示的就是特殊值。
如果阶码全部为1且尾数非零(隐含为1的高位不算在内),则由尾数的高位(隐含为1的高位也不算在内)确定该值代表的是未明非数(QNaN,Quiet Not-a-Number)还是明确非数(SNaN,Signaling Not-a-Number)(请参考表4-1)。非数(NaN)说明系统中发生了严重的计算错误,计算结果完全无法确定。QNaN代表结果不确定,而SNaN说明运算无效。无论参与计算的其他操作数是什么值,任何NaN参与的计算结果都是NaN。注意,NaN与符号位无关。表4-1列出了NaN的二进制表示形式。
表4-1 NaN的二进制表示形式
指数位全部为1并且尾数位全部为0的浮点数表示的是另外两个特殊值。这种情况下,具体表示的是+无穷(+Infinity)还是-无穷(-Infinity),由浮点数的符号位决定。表4-2列出了操作数中出现无穷时(事先定义好)的计算结果。
表4-2 涉及无穷的运算
最后,如两个特殊值-0或+0的指数位全部为0,由符号位确定浮点数表示的是-0还是+0。因为浮点数格式采用了1的补码表示,所以0有两种不同的表示形式。注意,在比较、算术运算和其他运算中,+0等于-0。
IEEE 浮点格式既支持+0,也支持-0(取决于符号位的值)。在算术计算和比较计算中,+0和-0是等价的,它们的符号位会被忽略。软件在操作表示0的浮点值时可以使用符号位作为标志来表示不同的含义。例如,符号位为0表示值刚好为0,而符号位为1表示值虽然非零但数值太小,当前格式无法表示。英特尔建议符号位为1表示0是负数下溢产生的,符号位为0表示0是正数下溢产生的(符号位清零)。推测运算结果为0时,英特尔的FPU会按照上面的建议设置符号位。