【学习计算机组成原理】浮点数表示特殊值


对于指数(阶码)和尾数我们有4种特殊情况

  1. 指数全0,尾数全0
  2. 指数全0,尾数非0
  3. 指数全1,尾数全0
  4. 指数全1,尾数非0

无穷(3)

  • 正无穷:0 11111111 0000 0000 0000 0000 0000 000
  • 负无穷:1 11111111 0000 0000 0000 0000 0000 000

在C语言中,一个int型数据除0,结果会溢出。
但是浮点型数据除0,结果是无穷。

非数(4)

  1. sqrt(-4)=?
  2. 0.0/0=?
  3. 无穷加无穷=?
  4. 无穷除无穷=?

以上类似这种得不出结果的式子,结果用非数(NaN)表示。对应的浮点数的指数全1,尾数非0 。

零(1)

指数全0,尾数全0用来表示0
0.00000000 × 2 126 0.0000 0000\times2^{-126}

非规格化数(2)

我们知道浮点数是有范围的,靠近0之间的数无法用规格化数表示。即-2-126至2-126
我们用指数全0,尾数非0表示这个区间的数。
与规格化数不同的是,尾数省略的首位不是1,而是0。
公式

  • SP(单精度) ( 1 ) s × ( 0 + E ) × 2 126 (-1)^{s}\times(0+E)\times2^{-126}
  • DP(双精度) ( 1 ) s × ( 0 + E ) × 2 1022 (-1)^{s}\times(0+E)\times2^{-1022}
  • 这里-126和-1022是固定的,不是0-127和0-1023(移码减去偏置常数)

用十进制表示数值数据

为了减少10进制与2进制的转换,有些系统用十进制表示数值数据。

ASCII码

符号位用一个字节表示,位于数字串之前。

  • 正号:2B
  • 负号:2D

其他的数字对应ASCII码即可。
比如:
+236可表示为 2B 32 33 36H
-2369可表示为 2D 32 33 36 39H
H代表16进制表示

BCD码

BCD(Binary Coded Decimal),即用二进制编码十进制
所以需要每一个十进制位用二进制编码。
十进制数共10个数,0~9,所以需要用4位2进制编码,尽管4位2进制可表示16种状态,剩余6种是多余的。
16种状态中,挑出10种状态编码十进制即可。另外用2种表示正负。

C++调试

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
	int n1 = 0;
	int n2 = 1;
	float n3 = 0;
	float n4 = 1;
	float n5 = -1;
	float n6 = pow(2, -126-23);
	float n7 = 0.5*n6;

	//cout << n2 / n1 << endl; 溢出,无法执行
	cout << n4 / n1 << endl; //正无穷
	cout << n5 / n1 << endl; //负无穷
	cout << n3 / n1 << endl; //非数
	cout << sqrt(n5) << endl;//非数
	cout << n6 << endl;//单精度正数最小值
	cout << n7 << endl;//比单精度最小值再小一点

	system("pause");
	return 0;
}

运行结果
在这里插入图片描述

发布了36 篇原创文章 · 获赞 34 · 访问量 3229

猜你喜欢

转载自blog.csdn.net/weixin_44611096/article/details/105199112
今日推荐