IEEE754在浮点数中存储的规则

IEEE754在浮点数中存储的规则

1.浮点数在IEEE754的存储格式

IEEE754标准是一种浮点数表示标准,一般分为单、双精度两种,单精度是32位的二进制数,双精度是64位的二进制数,一个浮点数的组分为以下几部分。

①V=(-1)^S*M *2^E
②(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
③M则代表1到2之间的额有效数字。
④2^E表示指数位。
我们具体来举例说明:例如十进制的5.75,我们先将它转换为二进制为101.11,此时我们可以将其转换为1.0111×2^2,那么,按照上面V的格式,可以得出s=0,M=1.0111,E=2。

2.IEEE754在内存中的存储模型

在我们得到浮点数的S,E以及M后,我们将其存入内存中,我们要来了解其存储模型,IEEE标准从逻辑上使用三元组{S,E,M}表示一个数V,如下图所示:
IEEE754在浮点数中存储的规则_第1张图片

根据IEEE754规定,单精度中V共32位,S占一位,E占8位,M占32位。
IEEE754在浮点数中存储的规则_第2张图片
双精度中V共64位,其中S占1位,E占11位,M占52位。

3.IEEE754对有效数字M和指数E,还有一些特别规定

在我们存储M时,上面说过M范围是2>M≥1,也就是说,M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。IEEE754规定,计算机在存储M时,省去小数点前面的1,只保留小数点后面的部分。例如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。
对于指数E来说,首先,E是一个无符号整数(unsigned int),这就意味着它无法存入负数,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0 ~2047.
但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。
当E不全为0或不全为1时,浮点数就采用此规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
当E全为0时,浮点数的指数E等于1-127(或者1-1023)即为真实值, 有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数,我们根据规定的推断这个指数起码是-126,一个数与2^-126相乘结果是无限接近于0的,这样做是为了表示±0,以及接近于0的很小的数字。
当E全为1时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)。

4.理解分析IEEE 754

我们来根据下面的代码来分析IEEE 754:

int main()
{
	int n = 9;
	float* p = (float*)&n;
	printf("n的值为:%d\n", n);//9
	printf("*p的值为:%f\n", *p);//0.000000
	*p = 9.0;
	printf("num的值为:%d\n", n);//1091567616
	printf("*p的值为:%f\n", *p);//9.000000
	return 0;
}

我们可以看到代码的四个答案,第一个n的值很好出,%d打印所以为9.
那么为什么p值为0.00000呢?我们首先知道
9的二进制表示为0000 0000 0000 0000 0000 0000 0000 1001,由9的二进制表示我们可知S=0,E=0,M为000 0000 0000 0000 0000 1001,此时符合我们第二种情况,E全为0,所以指数E为-126,V=1.001×2^(-146) ,这是一个无限接近于0的数字,所以十进制表示为0.000000。
接着我们来看,当为浮点数9.0时,9.0用二进制表示1001.0,即1.001×2^3。此时,S=0,M=1.001,E=3+127=130。指数130二进制为10000010,符号位S为0,有效位001后面加0,凑齐23位。
0 10000010 001 0000 0000 0000 0000 0000所以十进制表示为1091567616.
第四个为正输出浮点数
p所以为9.000000。

你可能感兴趣的:(IEEE754在浮点数中存储的规则)