【例题】给定一个浮点格式(IEEE 754),有k位指数和n位小数,对于下列数,写出阶码E、尾数M、小数f和值V的公式。另外,请描述其位表示。

前言: 上次学习汇编语言(清华大学 张悠慧)是在11月26日,内容是IEEE 754(浮点数表示)。当时撇下了一道题,等度过了12月(英语六级+本科阶段的最后考试+最后的大作业)再把汇编捡起来。现在正是把这个题目捡起来的时候。

11月26日的学习笔记:点击这里进入CSDN链接

题目

给定一个浮点格式(IEEE 754),有k位指数和n位小数,对于下列数,写出阶码E、尾数M、小数f和值V的公式。另外,请描述其位表示。

  • 数5.0;
  • 能够被准确描述的最大奇数;
  • 最小的正规格化数。

解决

前置知识一:IEEE 754

IEEE 754约定,计算机中浮点数二进制表示为:

数字形式: ( 1 ) s M 2 E (-1)^s M 2^E

  • 符号: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)
前置工作一:整理变量关系

B i a s = 2 k 1 1 Bias = 2^{k-1} - 1

E = e x p B i a s E = exp - Bias

V = ( 1 ) s M 2 E V = (-1)^s M 2^E

E最大值为 2 k 1 ( 2 k 1 1 ) = 2 k 1 2^k - 1 - (2^{k-1} - 1) = 2^{k-1}

前置工作二:总结特性

抛开例题,来看一个例子:

  • 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可视为 1 + 1 2 n × C 1+\frac{1}{2^n} \times C

其中,C是整数,由frac决定,即 C = o c t ( frac ) C=oct(\text{frac})

并且C满足 0 C 2 n 1 0 \le C \le 2^n - 1

默认V为正数(即s=0),则可将V表示为:

V = ( 1 + 1 2 n × C ) × 2 E = 2 E + 2 E n × C V=(1+\frac{1}{2^n} \times C) \times 2^E = 2^E + 2^{E-n} \times C

解决问题一:数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);
  • 是奇数( 2 E 2^E 是奇数则过于浪费,因此使 2 E n × C 2^{E-n} \times C 为奇数)。

下面分类讨论:

情况一:E可以取到n时,

2 k 1 n 2^{k-1} \ge n 时,

E取n,C取其能取的最大奇数,即1* 01(保证最右两位是01, 其他位为1)。

情况二:E*取不到n时,

2 k 1 n 2^{k-1} \le n 时(不太可能),

E取最大即 2 k 1 2^{k-1} ,而C取 2 n E 2^{n-E} (为了约掉后一项小数)。

解决问题三:最小的正规格化数

承接上文,认为exp为0* 1,frac为0*。

E取最小,即 e x p m i n B i a s = 2 0 ( 2 k 1 1 ) exp_{min} - Bias = 2^0 - (2^{k-1} - 1)

十进制即为 1 × 2 ( 2 0 ( 2 k 1 1 ) ) = 2 2 2 k 1 1 \times 2^{(2^0 - (2^{k-1} - 1))} = 2^{2 - 2^{k-1}}

总结

没有找到标准答案,特性与问题是我自己总结的。如果有错误与问题,欢迎通过[email protected]与我交流讨论。

在这里插入图片描述

另,12月确实太忙了,差点失去常规的学习状态,接下来可要复出咯!

发布了132 篇原创文章 · 获赞 36 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42815609/article/details/103767749
今日推荐