当前位置: C语言 -- 专题 -- 浮点数

浮点数(二)

四、二进制浮点数大小比较

二进制浮点数大小比较,先比较符号,再比较指数,最后比较小数。

1.一个正浮点数和一个负浮点数的大小比较

X = 0  0111 1101  0000 0000 0000 0000 0000 0002 = 0.2510

Y = 1  0111 1111  1100 0000 0000 0000 0000 0002 = -1.7510

因为X为正数,Y为负数,所以X>Y


2.两个正浮点数的大小比较

两个正浮点数大小比较时,可以直接比较指数,指数大的数大;如果指数相同,比较小数,小数大的数大。

X = 0  0111 1110  1100 0000 0000 0000 0000 0002 = 0.87510

Y = 0  0111 1111  1000 0000 0000 0000 0000 0002 = 1.510

X的指数部分为0111 1110小于Y的指数部分0111 1111,所以X<Y


X = 0  0111 1111  1100 0000 0000 0000 0000 0002 = 1.7510

Y = 0  0111 1111  1000 0000 0000 0000 0000 0002 = 1.510

XY的指数部分相同,所以需要比较小数部分;X的小数部分为1100 0000 0000 0000 0000 000大于Y的小数部分1000 0000 0000 0000 0000 000,所以X>Y


3.两个负浮点数的大小比较

两个负浮点数的大小比较,先比较两个浮点数的绝对值(绝对值的比较与两个正浮点数的大小比较相同。),然后再将比较结果取反。

X = 1  0111 1111  1100 0000 0000 0000 0000 0002 = -1.7510

Y = 1  0111 1111  1000 0000 0000 0000 0000 0002 = -1.510

所以X<Y


五、浮点数的值域

IEEE 754浮点标准中,偏置指数E应包括以下部分:

11(28-2)之间的所有整数,包括1(28-2),用以编码规格化数。

2、保留值0,用以编码±0和次规格化数。

3、保留值(28-1),用以编码±NaNs


浮点数X的值可以从组成字段推算得出:

a)如果E=(28-1),并且T≠0XNaN,并且与S无关。

例如:0  1111 1111  1000 0000 0000 0000 0000 0002表示NaN,即非数值。


b)如果E=(28-1),并且T=0X(-1)s×

例如:0  1111 1111  0000 0000 0000 0000 0000 0002表示+∞,即正无穷大。

   1  1111 1111  0000 0000 0000 0000 0000 0002表示-∞,即负无穷大。


c)如果1≤E≤(28-2)X为规格化数,T字段小数点的左边存在一个隐藏的1

例如:最小规格化数 0  0000 0001  0000 0000 0000 0000 0000 0002 = 2-126

   最大规格化数 0  1111 1110  1111 1111 1111 1111 1111 1112 = 2127(2-2-23)


d)如果E=0,并且T≠0X为次规格化数,T字段小数点的左边存在一个隐藏的0

例如:最小次规格化数 0  0000 0000  0000 0000 0000 0000 0000 0012 = 2-126(2-23) = 2-149

   最大次规格化数 0  0000 0000  1111 1111 1111 1111 1111 1112 = 2-126(1-2-23)


e)如果E=0,并且T=0X(-1)s×0

例如:0  0000 0000  0000 0000 0000 0000 0000 0002表示+0。

   1  0000 0000  0000 0000 0000 0000 0000 0002表示-0。


完整的浮点数的值域如下图所示:

浮点数的值域

其中:红色部分会发生下溢异常,数值范围为-2-149<X<00<X<2-149

   蓝色部分为次规格化数,数值范围为-2-126(1-2-23)≤X≤-2-1492-149≤X≤2-126(1-2-23)

   绿色部分为规格化数,数值范围为-2127(2-2-23)≤X≤-2-1262-126≤X≤2127(2-2-23)

   紫色部分会发生溢出异常,数值范围为X<-2127(2-2-23)X>2127(2-2-23)