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


对于指数(阶码)和尾数我们有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} 0.00000000×2126

非规格化数(2)

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序鸡

如果帮到您,点个赞鼓励一下吧。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值