前言: 上次学习汇编语言(清华大学 张悠慧)是在11月26日,内容是IEEE 754(浮点数表示)。当时撇下了一道题,等度过了12月(英语六级+本科阶段的最后考试+最后的大作业)再把汇编捡起来。现在正是把这个题目捡起来的时候。
11月26日的学习笔记:点击这里进入CSDN链接
题目
给定一个浮点格式(IEEE 754),有k位指数和n位小数,对于下列数,写出阶码E、尾数M、小数f和值V的公式。另外,请描述其位表示。
- 数5.0;
- 能够被准确描述的最大奇数;
- 最小的正规格化数。
解决
前置知识一:IEEE 754
IEEE 754约定,计算机中浮点数二进制表示为:
数字形式:
- 符号:s
- 尾数:M,是一个位于区间[1.0, 2.0)内的小数
- 阶码:E
编码形式:
s | exp | frac |
---|
exp域:E(注意,E要进行变换,再存储在exp中);
frac域:M。
前置知识二:规格化浮点数(Normalized)
这里讨论到规格化浮点数(Normalized):
- 满足条件:exp不全为0且不全为1。
- 真实的阶码值需要减去一个偏置(biased)量:
-
- E = Exp - Bias
-
- Exp:exp域所表示的无符号数值
-
- Bias的取值:
-
-
- 单精度数:127(Exp:1…254,E:-126…127)
-
-
-
- 双精度数:1023(Exp:1…2046,E:-1022…1023)
-
-
-
- Bias = 2^{e-1} - 1,e = exp的域的位数
-
- frac的第一位隐含1:M = 1.xxx…x_2
-
- 因此第一位的“1”可以省去,xxx…x:bits of frac
-
- Minimum when 000…0 (M = 1.0)
-
- Maximum when 111…1 (M = 2.0 - \epsilon)
前置工作一:整理变量关系
E最大值为 。
前置工作二:总结特性
抛开例题,来看一个例子:
- 8位浮点数表示:exp域宽度为4 bits,frac域宽度为3 bits。则,其偏置量的值为2^(4-1) - 1 = 7.
- 其他规则符合IEEE 754规范。
取值范围如下表。
s | exp | frac | E | value |
---|---|---|---|---|
0 | 0000 | 000 | -6 | 0 |
0 | 0000 | 001 | -6 | 1/8 * 1/64 = 1/512 |
0 | 0000 | 010 | -6 | 2/8 * 1/64 = 2/512 |
… | ||||
0 | 0000 | 110 | -6 | 6/8 * 1/64 = 6/512 |
0 | 0000 | 111 | -6 | 7/8 * 1/64 = 7/512 |
0 | 0001 | 000 | -6 | 8/8 * 1/64 = 8/512 |
0 | 0001 | 001 | -6 | 9/8 * 1/64 = 9/512 |
… | ||||
0 | 0110 | 110 | -1 | 14/8 * 1/2 = 14/16 |
0 | 0110 | 111 | -1 | 15/8 * 1/2 = 15/16 |
0 | 0111 | 000 | 0 | 8/8 * 1 = 1 |
0 | 0111 | 001 | 0 | 9/8 * 1 = 9/8 |
0 | 0111 | 010 | 0 | 10/8 * 1 = 10/8 |
… | ||||
0 | 1110 | 110 | 7 | 14/8 * 128 = 224 |
0 | 1110 | 111 | 7 | 15/8 * 128 = 240 |
0 | 1111 | 000 | n/a | inf |
可以看出,若frac有n位,则M可视为 ;
其中,C是整数,由frac决定,即 ;
并且C满足 。
默认V为正数(即s=0),则可将V表示为:
解决问题一:数0.5
较为简单,直接解决如下。
5.0 // 转换为二进制 ==>
101 // 进位,直到取最左1 ==>
M = 1.01 // 此时,E = 2
frac= 01 0* // 共n位
exp = E + Bias
= 2 + (2^(k-1) - 1)
则,位的描述为:
s | exp | frac |
---|---|---|
0 | bin(2 + 2^(k-1) - 1) | 01 0000…(共n位, 开头为01, 0补其他位) |
解决问题二:能够被准确描述的最大奇数
根据前置工作二,进行思考。现在的任务有两个:
- 不能有小数(C为小数,则E不可以大于n);
- 是奇数( 是奇数则过于浪费,因此使 为奇数)。
下面分类讨论:
情况一:E可以取到n时,
即 时,
E取n,C取其能取的最大奇数,即1* 01(保证最右两位是01, 其他位为1)。
情况二:E*取不到n时,
即 时(不太可能),
E取最大即 ,而C取 (为了约掉后一项小数)。
解决问题三:最小的正规格化数
承接上文,认为exp为0* 1,frac为0*。
E取最小,即 。
十进制即为 。
总结
没有找到标准答案,特性与问题是我自己总结的。如果有错误与问题,欢迎通过[email protected]与我交流讨论。
另,12月确实太忙了,差点失去常规的学习状态,接下来可要复出咯!