单精度的浮点数
对于内部存储数据(00111111)2:
符号位
(最左侧)S=0。这表示是个正数
指数
(左侧第2-9位)E=(01111110)2=(126)10,所以e=E-127=-1。
尾数
(最后的23位)M=(11001100110)2,m=(1.M)2=(1.7999999523162841796875)10
该二进制小数转为10进制的计算方式为1 + (1/2+1/4) + (1/32+1/64) + (1/512+1/1024)……
实际值
N=1.7999999523162841796875*2^-1=0.89999997615814208984375
(其实,这个数据是0.9的单精度浮点数的实际内部存储,可以看到有一定的误差)
这里继续给出另外几个数字的实例:
使用竖线|将各个段位分隔显示
实际值 | 符号位 | ;指数 | ;尾数
1 |
2 |
-6.5 | 1 | 10000001 | 10100000000 最大表示范围:单精度浮点数可以表示的范围为±3.40282 * 10^38(1.1111...1×2^127)
接近于0的最小值:单精度浮点数可以表示1.175 * 10-38(1.00...0×2^-126)的数据而不损失精度。
当数值比以上值小的时候,将会由于尾数的有效位数减少而逐步丧失精度(IEEE 754的规定),或者有的系统则直接采用0值来简化处理过程。 浮点数以有限的32bit长度来反映无限的实数集合,因此大多数情况下都是一个近似值。同时,对于浮点数的运算还同时伴有误差扩散现象。
特定精度下看似相等的两个浮点数可能并不相等,因为它们的最小有效位数不同。
由于浮点数可能无法精确近似于十进制数,如果使用十进制数,则使用浮点数的数学或比较运算可能不会产生相同的结果。
如果涉及浮点数,值可能不往返。值的往返是指,某个运算将原始浮点数转换为另一种格式,而反向运算又将转换后的格式转换回浮点数,且最终浮点数与原始浮点数相等。由于一个或多个最低有效位可能在转换中丢失或更改,往返可能会失败。