1. 概述
计算机中的小数分为定点数
和浮点数
,定点数比较简单,浮点数比较复杂,也是面试中常常被问到的问题,很多资料都讲得很简单,一笔带过,没有深入讲解,在本文中将对浮点数的误差问题做一个比较详细的深入分析。
2. IEEE754
标准
计算机中任何事都需要一个标准,处理浮点数存储的标准最通用的标准就是IEEE754
标准,该标准规定了4种浮点数类型:单精度
、双精度
、延伸单精度
、延伸双精度
,其中最常用的是单精度
和双精度
,如下表所示:
精度 | 字节数 | 正数取值范围 | 负数取值范围 |
---|---|---|---|
单精度类型 | 4 | 1.4e-45 至 3.4e+38 | -3.4e+38 至 -1.4e-45 |
双精度类型 | 8 | 4.9e-324 至 1.798e+308 | -1.798e+308 至 -4.9e-324 |
我们以单精度浮点数
(4字节,32位)为例来说明其原理,双精度浮点数
只是位数更多,原理类似。
浮点数都是以科学计数法
的方式存储数字的,它由符号
、有效数字
和指数
三部分组成,在IEEE中换了个名字,分别为:符号
、阶码
、尾数
,存储其值得对应就是符号位
、阶码位
和尾数位
.
单精度浮点数
占 32
位,最高位为符号位,占 1
位;接着为占 8
位的指数位,最后为占 23
位的尾数位,如下图所示:
3. 浮点数转化为二进制形式
计算机只能存储二进制数据,因此浮点数在存储时先将其转化为二进制的形式。
1)整数部分
整数部分转化比较好转化,除2取余数即可。
2)小数部分
小数部分转化为二进制跟整数部分不一样,小数部分每次乘2:如果大于1,则添加一个1
作为二进制位,并将相乘得到的结果中整数部分的1去掉,