浮点数
C语言中使用float、double、long double等浮点类型表示浮点实数;但这些浮点类型并不能表示所有实数,并且浮点类型几乎总是仅给出正确值的近似值。不同浮点类型所表示的数值范围和精度也有差异。
一、浮点数表示
浮点数表示的核心是科学计数法,例如浮点数X可以使用以下形式表示:
X = (-1)s×m×be
其中:(-1)s为浮点数的符号,s为0时,表示正数;s为1时,表示负数。
m为因数,由一系列数字构成,表示浮点数的精度。
b为基数(例如:2、10等。)。
e为指数。
现代计算机系统中,基数几乎总是为2,并且对于绝大多数浮点表示方法,m值在1到b之间。
一个数用科学计数法表示可以有多种表示形式,但规格化的表示形式只有一种,即小数点左边只有一位非0数字。
以十进制数123.45为例。
科学计数法的表示形式有:1.2345×102、12.345×101、0.12345×103等。
规格化的表示形式为:1.2345×102。
以二进制数10010.101为例。
科学计数法的表示形式有:1.0010101×24、10.010101×23、0.10010101×25等。
规格化的表示形式为:1.0010101×24。
二、IEEE 754浮点标准
IEEE 754浮点标准是美国电气电子工程师协会计算机学会下属的微处理器标准委员会发布的,该标准被现代计算机系统广泛使用。
IEEE 754浮点标准定义了5种基本格式,具体如下:
1.三种二进制格式,编码长度分别为32位、64位和128位。
2.两种十进制格式,编码长度分别为64位和128位。
本文主要阐述32位二进制格式浮点数的运算与操作。
IEEE 754浮点标准中浮点数X的科学计数法形式可表示为:
X = (-1)s×m×2e
一个浮点数可以用三个二进制字段来表示,如下所示:
S | E | T |
其中:S为符号字段,占1个位,如果值为0,表示正数;如果值为1,表示负数。
E为指数字段,它表示的指数是一个偏置指数(biased exponent),其值为真实指数加127。
例如:一个浮点数的真实指数为15,指数字段所表示的值为15+127=142。
S | 1000 1110 | T |
例如:指数字段如下所示:
S | 1000 0010 | T |
指数字段所表示的偏置指数为130,真实的指数为130-127=3。
通过使用偏置指数,将指数的取值范围从有符号的-126至127转变为无符号的1至254(注:0和255具有特殊含义。),这样便于浮点数的比较。
T为尾随有效字段(trailing significand field),该字段包含二进制小数,占23个位。m的实际值为(1+T),也就是说,在小数点的左边有1个隐藏的1。这样做的好处是提高了精度,用23个位得到了24个位的值,例如:
S | E | 1011 0011 ... |
m值为1.1011 0011 ...。
三、浮点类型表示形式和十进制的相互转换
1.将浮点类型表示形式转换为十进制数
将浮点类型表示形式转换为十进制数可以使用以下公式:
(1-2S)×(1+T)×2(E-127)
注:这里S、E、T均为十进制值。
以下面的表示形式为例:
1 | 1000 0010 | 1111 0000 0000 0000 0000 000 |
S值为110。
E值为1000 0010,等于13010。
T值为1111 0000 0000 0000 0000 000,等于0.937510。
然后将上述S、E、T值带入公式,
(1-2×1)×(1+0.9375)×2(130-127)
该表示形式的十进制值为-15.5。
2.将十进制数转换为浮点类型表示形式
以十进制数67.875为例。
第一步:先将十进制数转换为二进制数。
将十进制浮点数转换为二进制数时,整数部分除以2取余数;小数部分乘以2取整数。
低位 | |||
67 | % 2 | 余数为: | 1 |
33 | % 2 | 余数为: | 1 |
16 | % 2 | 余数为: | 0 |
8 | % 2 | 余数为: | 0 |
4 | % 2 | 余数为: | 0 |
2 | % 2 | 余数为: | 0 |
1 | % 2 | 余数为: | 1 |
高位 |
整数部分的二进制形式为1000 011。
高位 | |||
0.875 | × 2 | 整数部分为: | 1 |
0.75 | × 2 | 整数部分为: | 1 |
0.5 | × 2 | 整数部分为: | 1 |
低位 |
小数部分的二进制形式为0.111。
67.875的二进制形式为1000 011.111。
第二步:规格化表示形式。
1000 011.111×20 = 1.0000 1111 1×26
第三步:获取S、E、T值。
S值为02,因为67.875为正数。
E值为6+127 = 133 = 1000 01012。
T值为0000 1111 1000 0000 0000 0002。
该十进制数的浮点表示形式为:
0 | 1000 0101 | 0000 1111 1000 0000 0000 000 |