浮点数精度问题
浮点数的基数什么意思浮点数精度问题
⼀、浮点数的概念及误差问题:
浮点数是⽤来表⽰实数的⼀种⽅法,它⽤ M(尾数) * B( 基数)的E(指数)次⽅来表⽰实数,相对于定点数来说,在长度⼀定的情况下,具有表⽰数据范围⼤的特点。但同时也存在误差问题,这就是著名的浮点数精度问题!
浮点数有多种实现⽅法,计算机中浮点数的实现⼤都遵从 IEEE754 标准,IEEE754 规定了单精度浮点数和双精度浮点数两种规格,单精度浮点数⽤4字节(32bit)表⽰浮点数,格式是:
1位符号位 8位表⽰指数 23位表⽰尾数
双精度浮点数8字节(64bit)表⽰实数,格式是:
1位符号位 11位表⽰指数 52位表⽰尾数
同时,IEEE754标准还对尾数的格式做了规范:,⼩数点左⾯只有1位且不能为零,计算机内
部是⼆进制,因此,尾数⼩数点左⾯部分总是1。显然,这个1可以省去,以提⾼尾数的精度。由上可知,单精度浮点数的尾数是⽤24bit表⽰的,双精度浮点数的尾数是⽤53bit表⽰的,转换成⼗进制:
2^24 - 1 = 16777215 2^53 - 1 = 9007199254740991
由上可见,IEEE754单精度浮点数的有效数字⼆进制是24位,按⼗进制来说,是8位;双精度浮点数的有效数字⼆进制是53位,按⼗进制来说,是16位。显然,如果⼀个实数的有效数字超过8位,⽤单精度浮点数来表⽰的话,就会产⽣误差!同样,如果⼀个实数的有效数字超过16位,⽤双精度浮点数来表⽰,也会产⽣误差!对于 1310720000000000000000.66 这个数,有效数字是24位,⽤单精度或双精度浮点数表⽰都会产⽣误差,只是程度不同:
单精度浮点数: 1310720040000000000000.00
双精度浮点数: 1310720000000000000000.00
双精度差了 0.66 ,单精度差了近4万亿!采⽤IEEE754标准的计算机浮点数,在内部是⽤⼆进制表⽰的,但在将⼀个⼗进制数转换为⼆进制浮点数时,也会造成误差,原因是不是所有的数都能转换成有限长度的⼆进制数。对于131072.32 这个数,其有效数字是8位,按理应该能⽤单精度浮点数准确表⽰,为什么会出现偏差呢?看⼀下这个数据⼆进制尾数就明⽩了
显然,其尾数超过了24bit,根据舍⼊规则,尾数只取 100000000000000000010100,结果就变成单精度浮点数表⽰131072.312500,只有前8位才是有效的。