浅谈计算机内存中浮点数的表示
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位浮点数格式的示例:
相关文章推荐
- 关于PHP浮点数你应该知道的(All 'bogus' about the float in PHP)
- ASP编码必备的8条原则
- C#浮点数的表示和基本运算
- XML指南——XML编码
- C#中字符串编码处理
- ExtJS中文乱码之GBK格式编码解决方案及代码
- 程序员趣味读物 谈谈Unicode编码
- 文本文件编码方式区别
- C语言安全编码之数值中的sizeof操作符
- C#实现获取文本文件的编码的一个类(区分GB2312和UTF8)
- VC中BASE64编码和解码使用详解
- 计算机中的字符串编码、乱码、BOM等问题详解
- C#如何自动识别文件的编码
- Base64编码解码原理及C#编程实例
- C#编码好习惯小结
- javascript编码的几个方法详细介绍
- 详解JS-- 浮点数运算处理
- UTF8编码开发中页面空白问题的解决方法
- php生成固定长度纯数字编码的方法
- Javascript正则控制文本框只能输入整数或浮点数