为什么能精确表示的浮点数有效位数是7位

  • Post author:
  • Post category:其他


首先明确,7位有效位是整数部分和小数部分位数的和。例如:

float a=61.420001f。打印输出a=61.420002(62.420001机器无法表示,会自动向最近的能表示的数舍入成61.420001)

(整数部分2位+小数部分6位=8位>7位,所以不能精确表示)

为了深入理解原理,我们首先要了解浮点数在计算机内的表示。在计算机内,浮点数是以32位二进制数来存储表示的,其中32位分为符号位(1位)、阶码(8位)和尾数(23位)三个部分组成,参考计算机组成原理教材,格式如下,:

符号位          阶码          尾数

1位                8位           23位

比如130.0可表示为:130.0=1000  0010B=1.000  0010*(2^7)  //都要转化为1.xxx*(2^yy)这种形式

符号位(正负号)                  阶码(指数7+127)                                            尾数(小数部分)

0                                             1000 0110                                                        0000 0100 0000 0000 0000 000

从浮点数二进制表示格式可以知道,尾数部分表示的是23位效位数,因为23位尾数表示的是小数点右边的数,小数点左边是默认是1,所以一共能表示24位有效数,

而 2^(24) = 16777216,转化为十进制10^7 < 16777216 < 10^8,所以只能精确表示7位。

注意事项:以上只能说明超过7位一定不能精确表示,而小于7位时有可能被精确表示,为什么这么说,比如0.1就不能被精确表示,这是因为浮点数表示的并不是连续的数,而是离散的数。

以上纯属个人见解,还有些东西因为解释起来太复杂就所以就没说。



版权声明:本文为weixin_42130471原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。