2.4 浮点数的编码表示
1. 浮点数类型
C语言声明 | 操作数类型 | 存储长度(位) |
---|---|---|
float | 单精度浮点数 | 32 |
double | 双精度浮点数 | 64 |
long double | 扩展精度浮点数 | 80 / 96 |
2. 浮点数的表示
(1)浮点数(Floating Point)的表示范围
- 以下面的32位浮点数格式的规格化数为例,计算表示范围
①第0位数符S;
②第1~8位为8位移码表示阶码E(偏置常数为128);
③第9 ~31位为24位二进制原码小数表示的尾数M;
规格化尾数的小数点后第一位总是1,故规定第一位默认的“1”不明显表示出来。这样可用23个 数位表示24位尾数。
- 因为原码对称,故其表示范围关于原点对称。可表示的范围包括图中阴影部分和零
- 机器0:即尾数为0 或落在下溢区中的数
- 浮点数范围比定点数大,但数的个数没变多,故数之间更稀疏,且不均匀
(2)规格化数形式(Normal format)
为了能表示更多有效数字,通常规定规格化数的小数点前为1
- 32-bit 规格化数
其中:
①S是符号位(Sign)
②Exponent用移码(增码)来表示
③Significand 表示xxxxxxxxxxxxx(部分尾数) (基可以是2/ 4 / 8 / 16,约定信息,无需显式表示)
(3) IEEE 754 标准
- 单精度浮点数表示:
其中:
①Sign bit: 1 表示negative ; 0表示positive
②Exponent(阶码):全0或全1用来表示特殊值
SP规格化阶码范围为0000 0001 (-126) ~ 1111 1110 (127)
偏置常数(bias)为127 (single), 1023 (double)
③Significand(部分尾数):
规格化尾数最高位总是1,所以隐含表示,省1位
1 + 23 bits (single),1 + 52 bits (double)
==》单精度浮点(SP): (-1)Sx (1 + Significand) x 2(Exponent-127)
双精度浮点(DP): (-1)Sx (1 + Significand) x 2(Exponent-1023)
Q:为什么偏置常数要取127而不是128?
A: IEEE 754标准中,单精度浮点数可表示的范围是0000 0001 (-126) ~ 1111 1110 (127);若偏置常数使用128,则32位浮点数可表示的范围0000 0001 (-127) ~ 1111 1110 (126),[128-127=1,128+126=2^7 -1] , 而 2^126 ~2^127可表示的范围比 2^-127 ~ 2^-127 大。
Q: 已知float型变量x的机器数为BEE00000H,求x的值是多少?
A: 转化为二进制 :1 ,011 11101,110 0000 0000 0000 0000 0000
- 数符: 1 (负数)
- 阶(指数):
为避免混淆,用"阶码"表示阶的编码,用"阶"或"指数"表示阶码的值
阶码: 0111 1101B = 125
阶码的值: 125 -127 = -2- 尾数数值部分: 1 +1x2-1+ 1x2-2+ 0x2-3+ 0x2-4+ 0x2-5+… =1+2-1+2-2= 1+0.5 +0.25 = 1.75
所以,真值: -1.75x2-2= -0.4375
Q: 已知float型变量x的值为-12.75,求x的机器数是多少?
A: -12.75=-1100.11B =-1.10011B x 23
- 符号S=1
- 阶码E=127+3=128+2=1000 0010
- 显式表示的部分尾数Significant = 100 1100 0000 0000 0000 0000
所以: x 的机器数表示为: 1 ,1000 0010, 100 1100 0000 0000 0000 0000
转换为十六进制表示为:C14C0000H
3. 其他形式的机器数表示
前面的定义是针对规格化形式(normalized form)的数 那么,其他形式的机器数表示什么样的信息呢?
(1)0的机器数表示
- How to represent 0?
- exponent: all zeros
- significand: all zeros
- What about sign?Both cases valid.
+0: 0 00000000 00000000000000000000000
-0: 1 00000000 00000000000000000000000
(2)+∞/-∞的机器数表示
- 浮点数除0的结果是+/-∞, 而不是溢出异常.(整数除0为异常)
- 为什么要这样处理? 可以利用+∞/-∞作比较。例如:X/0>Y可作为有效比较
- How to represent +∞/-∞?
- Exponent: all ones (11111111B = 255)
- Significand: all zeros
+∞: 0 11111111 00000000000000000000000
-∞: 1 11111111 00000000000000000000000
(3)“非数”的表示(NaN)
- 例如“Sqrt (-4.0) ”,“0/0”等的结果称为Not a Number (NaN) ,即“非数”
- NaNs 可以帮助调试程序
- How to represent NaN ?
- Exponent: 255
- Significand: nonzero
4. 非规格化数(Denorms)的表示
- How to represent Denorms?
- Exponent: 0
- Significand: nonzero
关于浮点数精度的一个例子
61.419998和61.420002是两个可表示数,两者之间相差 0.000004。当输入数据是一 个不可表示数时,机器将其转换为最邻近的可表示数。
5. 总结
Exponent | Significand | 表示类型 |
---|---|---|
0 | 0 | +/-0 |
0 | nonzero | Denorms |
1-254 | 任意,小数点前隐含1 | Norms |
255 | 0 | +/-infinity |
255 | nonzero | NaN |
2.5 非数值数据的编码表示
1. 逻辑数据的编码表示
- 何时会用到逻辑数据:表示逻辑(关系)表达式中的逻辑值(真/假 )
- 表示: 用一位表示。N位二进制数(位串)可表示N个逻辑数据
- 运算: 按位进行。如,按位与/ 按位或/ 逻辑左移/ 逻辑右移等
- 识别: 逻辑数据和数值数据在形式上并无差别,也是一串0/1序列, 计算机靠指令来识别。
2. 西文字符的编码表示
- 特点
是一种拼音文字,用有限几个字母可拼写出所有单词
只需对有限个字母和数学符号、标点符号等辅助字符编码
所有字符总数不超过256个,使用7或8个二进位可表示 - 表示(常用编码为7位ASCII码)
十进制数字:0/1/2…/9
英文字母:A/B/…/Z/a/b/…/z –专用符号:+/-/%/*/&/……
控制字符(不可打印或显示) - 操作
字符串操作,如:传送/比较 等 - ASCII码表:
0 -- 30H
,A -- 41H
,a -- 61H
3. 汉字及国际字符的编码表示
(1)汉字的编码形式
- 输入码: 对汉字用相应按键进行编码表示,用于输入
- 内码: 用于在系统中进行存储、查找、传送等处理
- 字模点阵或轮廓描述: 描述汉字字模点阵或轮廓,用于显示/打印
Q: 西文字符有没有输入码?有没有内码? 有没有字模点阵或轮廓描述?
A: 西文可由键盘直接输入,不用输入码;但也有内码和字模点阵。
(2)GB2312-80字符集
- 由三部分组成
①字母、数字和各种符号,包括英文、俄文、日文平假名与片假名、罗马字母、汉语拼音等共687个
②一级常用汉字,共3755个,按汉语拼音排列
③二级常用汉字,共3008个,不太常用,按偏旁部首排列 - 汉字的区位码
①码表由94行、94列组成,行号为区号,列号为位号,各占7位
②指出汉字在码表中的位置,共14位,区号在左、位号在右 - 汉字的国标码
①每个汉字的区号和位号各自加上32(20H),得到其“国标码”
②国标码中区号和位号各占7位。在计算机内部,为方便处理与存 储,前面添一个0,构成一个字节。
(3)汉字内码
- 至少需2个字节才能表示一个汉字内码。为什么?
由汉字的总数(超过6万字)决定! 2^16=65536 - 可在GB2312国标码的基础上产生汉字内码
为与ASCII码区别,将国标码的两个字节的第一位 置“1”后
得到一种汉字内码(可以有不同的编码方案)
4. 多媒体信息的表示
- 图形、图像、音频、视频等信息在机器内部也用0和1表示
– 图形用构建图形的直线或曲线的坐标点及控制点来描述,而这些 坐标点或控制点则用数值数据描述
– 图像用构成图像的点(像素)的亮度、颜色或灰度等信息来描述 ,这些亮度或颜色等值则用数值数据描述
– 音频信息通过对模拟声音进行采样、量化(用二进制编码)来获 得,因此量化后得到的是一个数值数据序列(随时间变化)
– 视频信息描述的是随时间变化的图像(每一幅图像称为一帧)
– 音乐信息(MIDI)通过对演奏的乐器、乐谱等相关的各类信息用 0和1进行编码来描述
– ……. - 多媒体信息用一个复杂的数据结构来描述,其中的基本数据或者 是数值数据,或者是用0/1编码的非数值数据
2.6 数据宽度和存储容量的单位
1. 数据的基本宽度
- 比特(bit,位)是计算机中处理、存储、传输信息的最小单位
- 二进制信息最基本的计量单位是“字节”(Byte) –现代计算机中,存储器按字节编址
– 字节是最小可寻址单位 (addressable unit )
– 如果以字节为一个排列单位,则LSB表示最低有效字节,MSB 表示最高有效字节 - 除比特(位)和字节外,还经常使用“字”(word) 作为单位 。
“字”和“字长”的概念不同
- “字长”指数据通路的宽度。 ”字长”等于CPU内部总线的宽度、运算器的位数、通用 寄存器的宽度(这些部件的宽度都是一样的)
- “字”表示被处理信息的单位,用来度量数据类型的宽度
- 字和字长的宽度可以一样,也可不同
例1:对于x86体系结构,不管字长多少,定义“字”的宽 度都为16位,而从386开始字长就是32位了。
例2:对于MIPS 32体系结构,其字和字长都是32位。
数据通路指CPU内部数据流经的路径以及路径上的部件,主要是 CPU内部进行数据运算、存储和传送的部件,这些部件的宽度基 本上要一致,才能相互匹配。
2.数据量的度量单位
- 存储二进制信息时的度量单位要比字节或字大得多
- 容量经常使用的单位有:
– “千字节”(KB),1KB=210字节=1024B
– “兆字节”(MB),1MB=220字节=1024KB
– “千兆字节”(GB),1GB=230字节=1024MB
– “兆兆字节”(TB),1TB=240字节=1024GB - 通信中的带宽使用的单位有:
– “千比特/秒”(kb/s),1kbps=103 b/s=1000 bps
– “兆比特/秒”(Mb/s),1Mbps=106 b/s=1000 kbps
– “千兆比特/秒”(Gb/s),1Gbps=109 b/s=1000 Mbps
– “兆兆比特/秒”(Tb/s),1Tbps=1012 b/s=1000 Gbps
如果把b换成B,则表示字节而不是比特(位) 例如,10MBps表示10兆字节/秒
3. 程序中数据类型的宽度
- 高级语言支持多种不同类型和 不同长度的数据
–例如,C语言中char类型的宽 度为1个字节,可表示一个字 符(非数值数据),也可表示 一个8位的整数(数值数据)
–不同机器上表示的同一种类型 的数据可能宽度不同
- 必须确定相应的机器级数据表示方式和相应的处理指令