详解浮点数在计算机中的存储方式

存储方式(以单精度为例)

存储原理

先解释存储原理,更容易理解后面的内容。

例 4.25 这个浮点数
先将其转换为二进制,即 100.01
然后再用二进制科学计算法表示,转换过程为:100.01 -> 1.0001 ^ 2 -> >1.0001 ^ 10
最终,十进制8.25的二进制为 1.0001^10。
那么,其中的 1.0001 是尾数,存放在尾数位
10 为 指数,存放在指数位
符号为0(代表正数)。存放在符号位

大概原理就是这样,具体下面有一些细节补充

float 为单精度,共有32位。按照作用,分为三部分:1、符号位;2、指数位;3、尾数位。
位数的作用

1、符号位

表示整个浮点数的正负

2、指数位

存放浮点数的指数部分(二进制科学记数法的指数,不是十进制科学记数法的指数)。指数也有正负,使用移位存储来表示正负。

3、尾数位

存放浮点数的尾数部分。因为二进制科学记数法的尾数都是以1开头,因此尾数开头的1省去不记。即 23 位的尾数位可存储 24 位尾数。

附1,十进制浮点数转二进制

将整数部分和小数部分 分开转化。最后合到一起。

例如 4.6 -> 100.1001 1001……
整数: 4 -> 100,
小数:0.6 -> 1001 1001 ……

小数部分* 2 ,取结果的整数部分为第一位,然后再*2,取结果的整数部分为第二位,依次类推。

0.6 * 2 = 1.2 ,取 1
0.2 * 2 = 0.4 ,取 0
0.4 * 2 = 0.8 ,取 0
0.8 * 2 = 1.6 ,取 1
0.6 * 2 = 1.2 ,取 1

发现这里循环了。即部分浮点数的二进制是无限的。但是计算机存储浮点数的位数是固定的。计算机只能表示它能表示的部分。所以浮点数 有时候会出现精度丢失的问题。

练习: 8.5 转化为二进制。

附2,二进制浮点数转十进制

反过来就是了。将浮点数的第一位 * 2^ -1 , 第二位 * 2 ^ -2 , 第三位 * 2 ^ -3 ……。然后全部相加,计算总值。即 在这里插入图片描述
和 = 0.597656 (少了的部分为精度丢失)

附3,移位存储(移码)

8位有符号整型的表示范围是 [-127,127],如何 使用这个二进制表示255呢?

答:将 -127映射为 0, -126 映射为 1,……,最终,127则会被映射为255。移位存储原理与其类似。

在移位存储中,将每个数 + 偏置值(bias,值=2^k-1 -1)作为最终结果存储。

将原本的 -127 +127,变成0,转成二进制 0000 0000存放。
原来的 0 + 127 = 127 ,转成二进制 0111 1111 存放。
原本的 1 + 127 = 128 , 转成 1000 0000 存放。
可以看出,最高位的0和1 代表 负 正。

为什么采用移码而不是补码?

日常生活中我们对小数进行加减法时,为了方便,通常先把它们的指数化成一致,再比较前面的数值部分;

比如1e-3与1e-1,我们化为1e-3和100e-3,这样就能很明显的得到结果 99e-3了

同样,在计算机中亦是如此;容易得知,移码是有大小顺序的。简单说就是:移码方便。

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值