您的位置:首页 > 理论基础

浅谈计算机内存中浮点数的表示

2017-01-22 00:17 316 查看


什么是浮点数

提到浮点数相信大家一定不会很陌生,浮点数表示对形如V=x*(z^y)的有理数进行编码,它对执行涉及非常大的数字(|V|>>0)和非常接近于0的数字是非常有用的。

浮点数在内存中的存储

废话不多述,直接进入正题,首先,我们来看看下面这段代码,大家可以自行在自己的编译器上运行一下:

#include <stdio.h>

int main()
{
float a = 0.0;
float b = -0.0;
int* pa = (int*)&a;
int* pb = (int*)&b;
printf("%f--->%d\n", a, *pa);
printf("%f--->%d\n", b, *pb);
return 0;
}


我们来看看运行结果吧:



代码中的意思是想看看浮点数0.0和-0.0转化成整型存储是什么样的,通过结果我们发现,浮点数在计算机内存中的存储方式和整形应该是不一样的。

那么究竟是哪里不一样? 我们下面看一看。

IEEE754标准

在1985年,提出了IEEE标准,这是一个仔细制定的表示浮点数执行和运算的细节。

在IEEE标准中,浮点数用V=(-1)^s×M×2^E来表示;

它的各个参数分别代表如下意义:

s(符号位):s决定这个浮点数是正数还是负数;

-* M(尾数,有效数字)*:M是一个二进制小数,它的范围为1~2或者0~1;

E(阶码,指数位):E的作用是对小数加权,这个权是2的E次幂;

在计算机中浮点数是被这样存储的

对于单精度浮点数(32bit)来说:



对于双精度浮点数来说:



根据E的值,又可以将被编码的值分为三种不同的情况:



规格化:对于规格化的来说,阶码E被解释为以偏置形式表是的有符号整数,它的值为E=e-Bias(Bias为偏置值,e为无符号数(如图所示)),其中Bias为e的二进制位数,尾数M的值为M=1+f(f描述的是小数字段的值);

非规格化:当阶码域都为0时,所表是的数为非规格化的形式,在这种情况下E=1-Bias,尾数M的值为f;

特殊值:图中的情况三和情况四为特殊值的情况,它是当阶码域的位都为1时所出现的情况,此时如果小数域为0,那么该浮点数表示的范围无穷大,如果小数域不等于0,那么此时浮点数将没有意义;

关于这三种情况在数轴上的分布,如下图:



下面给出一张表,展示一下8位浮点数格式的示例:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息