简单粗暴的记录一下浮点数原理

浮点数在计算机存储的计算方式和10进制的科学记数法类似
10进制科学记数法的表达式是±aEn,其中En表示10的n次方,计算公式:±a × (10 ^ n)
a是任意数,n是任意整数,可以通过n移动小数点的位置
例如:
100 = 1E2 = 1 × (10 ^ 2)
0.001 = 1E-3 = 1 × (10 ^ -3)
820 = 82E1 = 8.2E2
-0.082 = -8.25E-2 = -8.25 × (10 ^ -2)

在计算机里面浮点数是用二进制存储的,所以要用2进制计算:±1.M × 2^n
上面的计算公式中,只要知道 “符号±”、“有效数小数部分M”和“指数n” 这3个值就可以求出浮点数是多少了,其中 1.M 的1是固定的,下面会解释为什么要这样子。

好了,知道怎么计算浮点数了,那只要知道计算机是怎么存储上面3个值就行了,这里以单精度浮点数 float 为例:

IEEE754标准规定,浮点数由“符号”、“指数”和“尾数”3部分构成:在这里插入图片描述
单精度浮点数一共只有32位,其中 :

  • 31是符号位±,用1位表示,0 为正 +,1 为负 -
  • 23~30是指数位n,用8位表示,值范围 0 ~ 255,为了可以取一半的数记录负数,所以要减去偏移值127,真正范围是:-127 ~ 128。PS:记录负数是为了可以左移小数点
  • 0~22尾数位M,用剩下的23位表示,这个存储的是有效数的小数部分,为什么是小数部分?因为固定了整数部分是1,所以真正的有效位数是 23位二进制小数 + 1位整数位 = 24位,这样就可以多一位出来了。

整数部分为什么是1?我们直接做几个例子来理解:
先提供一个在线计算二进制工具:http://tool.oschina.net/hexconvert

1.计算 0.3125

转二进制为 0.0101
将小数点左移2位到第一个1的后面得 1.01 × (2 ^ -2)
得:
符号位是+,1位二进制为 0
指数位是-2,加上偏移值127是125,8位二进制为 01111101
尾数位去掉整数是 01,不足23位后面补0,所以23位二进制为 01000000000000000000000
完整的浮点数二进制是 0 01111101 01000000000000000000000

2.计算 -22.2

转二进制为 -10110.001100110011001100110011001100110011001100110011
将小数点右移4位到第一个1的后面得 -1.0110001100110011001100110011001100110011001100110011 × (2 ^ 4)
得:
符号位是-,1位二进制为 1
指数位是4,加上偏移值127是131,8位二进制为 10000011
尾数位去掉整数是 0110001100110011001100110011001100110011001100110011,超过23位只保留23位,所以23位二进制为 01100011001100110011001
完整的浮点数二进制是 0 10000011 01100011001100110011001

精度丢失

试用上面的-22.2计算出来的二进制反算回十进制
刚刚计算的二进制结果是 0 10000011 01100011001100110011001
符号位值是0,对应是负号-
指数位值是10000011,转十进制是 131,再减去偏移值 127得出指数是 4
尾数位值是 01100011001100110011001 这是二进制的小数部分,前端加上整数1得完整有效数 1.01100011001100110011001
将上面值套入公式 ±1.M × 2^n = -1.01100011001100110011001 × (2 ^ 4) = 10110.0011001100110011001
再将得出的结果转成十进制是 -22.19999885559082

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值