欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-06 08:20:01
...


对于指数(阶码)和尾数我们有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×21260.0000 0000\times2^{-126}

非规格化数(2)

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

  • SP(单精度)(1)s×(0+E)×2126(-1)^{s}\times(0+E)\times2^{-126}
  • DP(双精度)(1)s×(0+E)×21022(-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;
}

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