目录
引言
1.浮点数的表示
1.1浮点数的作用和基本原理
1.2浮点数规格化
左规
右规
2.IEEE 754 标准
2.1图示:
2.2 阶码的全零全一有特殊含义:
2.3 IEEE 754 表示的范围:
2.4 十进制转IEEE 754:
2.5 IEEE 754转十进制:
3.浮点数的加减运算
①对阶
②尾数加减
③规格化
④舍入
⑤判溢出
4.C语言的强制类型转换
无损
有损
引言
浮点数(floating-point number)是一种用于表示实数的计算机数据类型,可以表示非常大或非常小的数,同时也可以表示带小数的数。浮点数通常用科学计数法表示,其中包含一个有效数字和一个指数。例如,3.14可以表示为3.14×10^0,而3000可以表示为3.0×10^3。
浮点数的表示方式通常如下: 浮点数=有效数字×10指数\text{浮点数} = \text{有效数字} \times 10^{\text{指数}}浮点数=有效数字×10指数 在计算机中,浮点数一般遵循IEEE 754标准,该标准定义了浮点数的表示格式。
具体实例: 假设我们需要表示数字123.456。
在科学计数法中,这个数字可以表示为: 1.23456×1021.23456 \times 10^21.23456×102
在IEEE 754单精度浮点数(32位)中,该数字的表示方式如下:
- 符号位(1位):0 表示正数,1 表示负数。
- 指数部分(8位):表示指数部分。
- 尾数部分(23位):表示有效数字的小数部分。
我们来具体计算这个例子:
-
将123.456转换为二进制形式:
- 整数部分123转换为二进制:1111011
- 小数部分0.456转换为二进制:0.0111011111...
- 组合起来:1111011.0111011111...
-
转换为标准化形式(科学计数法形式):1.1110110111011111... × 2^6
- 其中,1.1110110111011111... 是有效数字,6 是指数。
-
指数部分加上偏移量(127,对于单精度浮点数):6 + 127 = 133
- 转换为二进制:133 = 10000101
-
尾数部分截取23位:1110110111011111...
最终,浮点数的表示为:
- 符号位:0
- 指数部分:10000101
- 尾数部分:1110110111011111...
整个32位浮点数的二进制表示如下: 0 10000101 11101101110111110 \, 10000101 \, 11101101110111110100001011110110111011111
这是一个具体的浮点数表示实例,展示了如何在计算机中表示和存储浮点数。
1.浮点数的表示
1.1浮点数的作用和基本原理
定点数可以表示的数字范围有限,但我们又不能无限制的增加数据的长度。
浮点数就可以做到在二进制位数不变的情况下增加数据的表示范围。
1.2浮点数规格化
在整体存储空间不变的情况下尽可能多的保存更多的精度。
例如十进制的科学表示法会要求尾数部分的最高位是有效值:
左规
当浮点数运算的结果为非规格化时要进行规格化处理,将尾数算数左移一位,阶码减1。
右规
当浮点数运算的结果尾数出现溢出(双符号位为01或10)时,将尾数算数右移一位,阶码加1。
2.IEEE 754 标准
2.1图示:
类型 | 数符 | 阶码 | 位数数值 | 总位数 | 偏置值 | |
十六进制 | 十进制 | |||||
短浮点数(float) | 1 | 8 | 23 | 32 | 7FH | 127(2^(8-1)-1) |
长浮点数(double) | 1 | 11 | 52 | 64 | 3FFH | 1023(2^(11-1)-1) |
临时浮点数(long double) | 1 | 15 | 64 | 80 | 3FFFH | 16383(2^(15-1)-1) |
2.2 阶码的全零全一有特殊含义:
阶码 | 尾数 | 表示 |
全为0 | 不全为0 | 表示非规格化小数±(0.xx..x)ⅹ2^-126 |
全为0 | 全为0 | 表示真值±0 |
全为1 | 全为0 | 无穷大±∞ |
全为1 | 不全为0 | 表示非数值“NaN”(NotaNumber) |
2.3 IEEE 754 表示的范围:
格式 | 数值 | 码值 | |
单精度 | 最大绝对值 | 2^128 - 2^104 | 0 11111110 1111 1111 1111 1111 1111 111 |
最小绝对值 | 2^(-126) | 0 00000001 0000 0000 0000 0000 0000 000 | |
双精度 | 最大绝对值 | 2^1024 - 2^971 | 0 11111111110 1*52 |
最小绝对值 | 2^(-1022) | 0 00000000001 0*52 |
解释:
单精度浮点数格式有1位符号位,8位指数位,23位尾数位(但有效数字是24位,因为有一个隐含的1)。
- 最大指数是
254
(即11111110
),但减去偏移量127
得到127
,所以最大的实际指数是127
。 - 最大的尾数是
1.11111111111111111111111
,即2 - 2^-23
。
IEEE 754单精度浮点数的尾数部分是一个24位的二进制数,包括一个隐含的1位。也就是说,尾数可以表示为1.xxx...xxx,其中xxx...xxx表示尾数的23位。
当尾数的23位全是1时,这个数值表示的是最大的尾数值:
这个数值可以写成:
这是一个几何级数,其总和是:
这个级数可以表示为:
即:
因此,当尾数的23位全是1时,其值为:
2.4 十进制转IEEE 754:
将-0.75转换为IEEE 754单精度浮点数格式表示。
数符:负数为1;
尾数:(-0.75)10 = (-0.11)2 = (-1.1 ✖ 2^-1)2 为 1000 0000 0000 0000 0000 000 因为自动代表最前头有个1.
阶码:-1 转为移码表示 -1+127 = (126)10 = (0111 1110)2
IEEE754:
0 | 1 8 | 9 32 |
1 | 0111 1110 | 1000 0000 0000 0000 0000 000 |
2.5 IEEE 754转十进制:
将IEEE754 的单精度浮点数C0A00000H 化为十进制数:
先化为二进制: 1100 0000 1010 0000 0000 0000 0000 0000
数符:1,是个负数
阶码:(1000 0001)2 = (129)10 129 - 127 = 2
尾数:1.01 (自动前头表示的有个零)
(1.01)2乘以2^2= (101)2 = 5
是个负数,所以结果是 -5
3.浮点数的加减运算
以2009年考研题为例:
【2009 统考真题】浮点数加、减运算过程一般包括对阶、尾数运算、规格化、舍入和判
断溢出等步骤。设浮点数的阶码和尾数均采用补码表示,且位数分别为5和7(均含2位符号位)。若有两个数X=2^7×29/32和Y=2^5×5/8,则用浮点加法计算X+Y的最终结果是(D)。
A. 00111 1100010 B. 00111 0100010
C. 01000 0010001 D.发生溢出
先将xy化为对应二进制浮点数:
X:
00111 0011101
Y:
00111 0000101
①对阶
小阶对大阶
我们在最开始就化好了
②尾数加减
0011101
+0000101
——————
0100010
00111 0100010
③规格化
01000 0010001
④舍入
无舍入
⑤判溢出
阶码符号位01,溢出,故选D选项。
4.C语言的强制类型转换
类型 | 16位机器 | 32位机器(考研常考) | 64位机器 |
char | 8 | 8 | 8 |
short | 16 | 16 | 16 |
int | 16 | 32 | 32 |
long | 32 | 32 | 64 |
long long | 64 | 64 | 64 |
float | 16 | 32 | 32 |
double | 64 | 64 | 64 |
无损
char → int → long →double,数值位完全够用,既不会损失精度也不会溢出
有损
int → float 可能会损失精度
float → int ,可能溢出,也可能损失精度