前言: 我的个人听课记录,毕竟是初学,错误在所难免,我知道了错误会改正更新,欢迎指导也欢迎一起讨论学习。
2.2 机器数的定浮点表示
引言
上次课解决了如何表示带符号数的符号在计算机的表示方法——设置首位为符号位,这次课解决计算机中小数点的表示方法——不表示。
小数点在计算机中不表示,只是和计算机约定好了小数点存在的位置。
计算机可以分成整数机和小数机。(都是定点机)
小数机只处理小数,即送到小数机的数必须是小数且必须是纯小数,约定小数点在符号位后边。
整数机只处理整数,即送到整数机的数必须是整数,约定小数点在数的末尾。
基本原理都是将小数点固定在双方约定的位置,因此不需要表示在数字中。
2.1定点机
定点小数
小数机约定:小数点在符号位后边。
定点整数
整数机约定:小数点在数据末尾。
例题
例1:X=1001的十进制数
小数机:1.001=-0.125D?错,原码or补码?
原码:-2-3=-0.125
补码:1.110+1=1.111,
即 -(2-1+2-2+2-3)= -0.875
整数机:
原码:1001即-1
补码:1110+1=1111,即-7
例2:X=1000
原码:
整数:1000即-0
小数:1.000即-0
补码:
整数:1111+1=0000,即+0, 阿哦,错了。
它不眼熟吗?补码1000是-8呀!!(整数的负的最大)
小数:-1 (1.000小数的负的最大为-1)
2.2.2浮点机
核心:科学计数法表示。
+32.75,用科学计数法表示为:+0.3275
×
\times
× 102
即存储: 0.3275 和 2
例:11.011 即+ 0.11011
×
\times
× 2+10
(其中都是二进制,10是2)
在计算机中应存储:
011011 和010,
且定义011011为尾数,定义010为阶码。
于是浮点机规格可以用(m,n)表示,其中m表示阶码有m位,n代表尾数有n位。
定浮点数的表示举例:-6.5:
定点小数:(-6.5)D=(-110.1)B
原码:11101
原码:10010+1=10011
定点正数:
原码:11101
补码:10011
浮点机:-6.5=-110.1=-0.1101* 2^11(11是3)
原码:11101 011
补码:10011 011
尾数的原码转补码即10010+1=10011 阶码011的补码即011(正数)。
PS:
定点正数和定点小数的原补码虽然长得一样,但具体不一样。
定点小数的原补码隐含小数点在符号位后边,
而定点小数的原补码隐含小数点在末尾。
可以看到定点整数和定点小数用5位就可以表示,而浮点机的话需要用8位才能表示。于是引出精度和范围比较:
2.2.3精度和范围比较
精度:一种编码方式下两个数之间的最小距离。
定点整数精度:最小距离就是1;
定点小数精度:对于:an-1an-2···a0的最小距离是2-(n-1) 那么8位就是2-7= 1 128 {1}\over{128} 1281
浮点数精度(4,4):尾数:2-3 阶码 :2-7
所以2-3
×
\times
× 2-7=2-10
范围(8位原码为例)
定点小数:1111 1111 ~0111 1111
(隐含小数位在符号位之后)
即:-(1-2-7) ~ +(1-2-7)= -
127
128
{127}\over{128}
128127~ +
127
128
{127}\over{128}
128127
定点整数:1111 1111~0111 1111
(隐含小数在末尾)
即:-(27-1) ~ (27-1)= -127~ +127
浮点数(4,4):
0111 1111~0111 0111
即:-0.875
×
\times
× 27~+0.875
×
\times
× 27
8位机原码总结:
精度 范围
定点整数: 1 -127/128 ~ +127/128
定点小数: 1/128 -127 ~ +127
浮点数: 2^(-10 ) -0.875*2^7 ~ +0.875*2^7
可以看到从上往下精度越来越精,范围越来越窄。
规格化浮点数
例:
(-6.5)D=(-110.1)B
= - 0.1101
×
\times
× 211(规格化浮点数)
= - 0.01101
×
\times
× 2100(非规格化浮点数)
求几个特殊规格化数:
(4,4)规格化浮点数最大的数,最小的数,
离0最近(正的)的数。
a.最大:0111 0111,是规格化的
b.最小:0111 1111,是规格化的
c.离0最近(正的):1111 0001,不是规格化的,所以规格化的离0最近的数是:1111 0100
2.2.4阶码
引入:
3.28
×
\times
× 102+0.42
×
\times
× 103
=(0.328+0.42)
×
\times
× 103
在计算机中我们可以用比较器比较2和3的数,输出3,
之后将0.328和0.42送到加法器中进行运算。
但是:如果是3.28
×
\times
× 10-2+0.42
×
\times
× 10-3呢?
-2是 1010,-3是1100,比较器比较出来的是-3大,不对。于是引入了移码,移动使其全为正数。
于是给出移码的运算规则:
[
X
]
移
[X]_移
[X]移=
[
X
]
补
[X]_补
[X]补+偏置值。
偏置值有两种。一种是2n-1一种是2n-1-1。这里的n包括符号位。
也给出更简单的实现方案:
偏置值为2n-1时,可以看成补码的符号位取反;
于是偏置值为2n-1-1时,可以看成补码的符号位取反后减1。
例:
[
X
]
浮
[X]_浮
[X]浮=
[
11010111
]
补
[11010111]_补
[11010111]补(4,4)
可得阶码:1101(补码形式)
如果用偏置值:
偏置值是24-1=1000,1101+1000=0101(1 0101)
补码形式1101,符号位取反为:0101
偏置值是24-1-1=0111,1101+0111=0100(1 0100)
补码形式1101,符号位取反后减1 是:
0101-1=0100
例题:
求:-14.25.写出(6,6)浮点数(阶码用移码表示,尾数用原码)
-14.25= - 1110.01
= - 0.111001
×
\times
× 2100
6位阶码:000100求移码:补码形式符号位取反:100100
6位尾数:111100(位数不够,舍掉最后的1)
所以答案:100100111100
2.2.5 实用浮点数举例:IEEE 754标准
规定:
a 第一位(最高位)为尾数的符号,即整个数的符号
b 尾数用原码表示
c 尾数必须是规格化的。
即小数点后面是1,所以IEEE754标准将1隐藏。好处:尾数可以多表示一位。
第三个要求:
101.111=0.101111
×
\times
× 2100(上边的)
然而用IEEE标准表示:1.01111
×
\times
× 2^11(其中小数点前的1隐藏)
例题来体会:
求-32.75短浮点数IEEE标准表示
-32.75
= -100000.11
= -1.0000011
×
\times
× 2101
首位符号位:1
阶码(8位):00000101->10000101
尾数(32):1. 0000011 0000 0000 0000 0000
IEEE标准:11000010000000110000000000000000
用十六进制表示:
1100——C
0010——2
0000——0
0011——3
16个0——0000
所以用16进制表示为:C2030000H
求出:(C2430000)H=( ?)D
答案: - 48.75
·
·
·
·