1985年,随着
IEEE标准754
的推出,制定出了浮点数的统一表示以及运算的标准
目前,所有的计算机都支持这个标准,为科学应用程序在不同机器上的可移植性鉴定了基础
IEEE 754标准
计算机是不认识
.
的,那么二进制小数中的点需要被保存下来,它是如何保存的呢?
IEEE浮点标准用 V = (-1)s * M * 2E
表示一个浮点数
符号位s,决定这是一个正数还是一个负数,当s为0时为正数,1时为负数
M位,即有效数字位,该值是一个二进制小数,它的范围为(大于1,小于2)
E指数位,又称阶码位,作用是对浮点数加权
IEEE 754规定,数字系统中的浮点数是对数学中小数的近似,同时规定表达浮点数的0,1序列被分为三部分(三个区域)
对于32位单精度浮点数来说,exponent的宽度为8,fraction位宽度为23表示实际的值M
表示规则:
如125.12510
首先将十进制小数转为二进制小数,得到1111101.0012
将二进制小数转为IEEE浮点数标准格式V,即1.111101001 * 26
对照以上图示,sign符号位为0,表示正数,exponent表示科学计数法的指数部分,
注意
:这里所填的指数并不是前面计算出来的6,而是等于实际指数值6加上
一个(指数偏移值
),对于32位单精度浮点数
来说,偏移值
为127
,所以exponent
值为127 + 6 =133
,二进制表示为10000101
fraction表示有效字位,又叫
尾数
,即2. 中二进制表示值得小数部分(为何是小数部分,因为1默认省略掉了)即111101001,再补齐至23位,即得到fraction处位表示为:11110100100000000000000因此32位单精度浮点数125.12510在计算机中被表示为
0 10000101 11110100100000000000000
空格是为了区分三段得
对于64位双精度浮点数
来说,exponent
段为11
位,偏移值
为1023
,fraction段长度为52位(64 - 1 - 11)
最后
我们知道在任意两个不等的实数之间总有无穷多个两两不等的实数,但浮点数不是这样,浮点数是稀疏的
,两个浮点数之间只有有限个浮点数,并且两个相邻的浮点数之间的距离可能很大,这就是精度的问题
比如两个相邻的32位单精度浮点数
01111110100000000000000000000001
01111110100000000000000000000000
在32位单精度浮点数中,他们两个是相邻的数,但他们的差值却高达1.014 * 10的31次方
也就是说,处于他们差值以内的数都无法表示
64位双精度浮点数不仅表示得数得范围扩大
了,而且其所刻画得浮点数分布更加细密
,相对误差也更小
但无论如何,浮点数终究只是实数(小数)得粗糙近似,不可能完全刻画实数,因为浮点数得位数终究是有限的,也就是说他所能表示的总是有限个有理数
最后,推荐一篇关于单精度和双精度浮点数的区别的好文
java浮点类型float和double的主要区别
实数转换流程图