神奇的二进制(二)浮点数

上一篇我们讲了二进制转十进制的规则,这一篇我们来看看浮点数是如何用二进制表示的。

像100.011这样带小数点的表现形式,是方便我们阅读的二进制形式,在计算机内部是无法直接使用的,那么实际上计算机内部是如何处理小数的呢?很多编程语言都提供了两种表示小数的数据类型,单精度浮点数和双精度浮点数。

单精度浮点数类型float用32位数据表示,双精度浮点数类型double用64位数据表示,这些数据类型都用浮点数来表示小数,浮点数又是什么东西呢?我们来看一下。

在六、七十年代,各家计算机公司的各个型号的计算机,有着千差万别的浮点数表示,却没有一个业界通用的标准。这给数据交换、计算机协同工作造成了极大不便。各自为政,那怎么行呢?直到1985年,IEEE(电气和电子工程师协会)统一了浮点数的表示规则,后来此标准被称为IEEE745浮点标准,大大提高了科学应用程序在不同机器上的可移植性。

IEEE浮点数标准用以下形式表示一个数:

1.S表示符号位,0表示正数,1表示负数

2.M表示尾数,大于等于1小于2

3.E表示2的E次幂

 

由于1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.101的时候,只保存101,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。你看,一不小心又提高了一位精度,科学家为了少用1位的空间都绞尽脑汁,我们平时写程序经常浪费巨大的开销都浑然不觉,相比之下,实在汗颜。

 

单精度的浮点数表示如下:

 

双精度的浮点数表示如下:

第一位是符号位,0表示正数,1表示负数,这个很好理解。

指数部分有点特殊,因为指数有正数也有负数,指数部分没有符号位,那如何表示正数和负数呢?聪明的科学家找到了一个方法,取一个中间值,小于中间值的表示负数,等于中间值的表示0,大于中间值的表示正数,中间值的定义如下:

 

单精度的中间值是127

 

双精度的中间值是1023

 

比如单精度的指数部分为10110001,转换成十进制是177,那么指数部分就是177-127 等于 50。

 

我们来看一下1.25用浮点数是怎么表示的,在Java中输出1.25的二进制如下:

由于输出的二进制数量不足32位,在前面补2个0,让它的长度变成32位:00111111101000000000000000000000

 

浮点数转换成十进制计算过程如下:

 

1. 符号位0表示正数

2. 指数部分,01111111的十进制值是127,单精度的中间值是127,127-127=0,所以指数部分是0

3. 尾数部分,前面隐藏了1,加上1后就是1.01000000000000000000000转成十进制就是1.25

4. 1.25 * 2^0 = 1.25 * 1 = 1.25

 

这样分析一下,对浮点数是不是更了解一些了呢?欢迎关注我的公众号,嘻嘻。

 

                                                     

 

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值