计算机的错误计算(十)

摘要  本节介绍浮点数的表示误差。

       浮点数的表示误差是指十进制数转换成二进制数时产生的误差。双精度下,二进制数有 53 位二进制有效数字(称为 bit), 并且 2^{53}=0.9007199254740992e16 有 16位整数,所以很多时候浮点数具有16位左右正确数字。

例1.  双精度下,十进制的 0.1 变成了含有 53 位有效数字的二进制数,而该二进制数实际等于另外一个十进制数:

(0.1)_{10}\\ \approx (0.000\underbrace{11001100110011001100110011001100110011001100110011001}_{53\,\,bits})_2\\=(0.0\underbrace{9999999999999999}_{16 \,\,bits}167332731531132594682276248931884765625)_{10}

于是,产生了表示误差(即二者的差):

0.09999999999999999167332731531132594682276248931884765625-0.1\\=-0.832667268468867405317723751068115234375e-17.

另外,在理论上,0.1=0.0\dot{9}=0.0999...,所以上式有连续 16 个 9。

        双精度下,机器能表示的非负浮点数数目不会超过

2047*2^{52}=0.9218868437227405312e20,

用其表达C++的(最小值, 最大值)区间

(2.22507e-308, 1.79769e+308)

范围内的的实数,很大的概率会产生表示误差。

       再比如 123.456 变为:

(123.456)_{10}\\ \approx (\underbrace{1111011.0111010010111100011010100111111011111001110110}_{53\,\,bits})_2\\=(\underbrace{123.4559999999999}_{16 \,\,bits}88858689903281629085540771484375)_{10}

其表示误差为:

123.455999999999988858689903281629085540771484375-123.456\\=-0.11141310096718370914459228515625e-13.

       其实,通过分析下面类型的十进制数,我们可以看到,当小数转换成二进制数时,成为无穷位的概率极大。

1. \{0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9\} 9个数中,只有 \{0.5\}  1个 数的二进制数是有限位的,其余 8个数的二进制数均为无穷位;

2. \{0.10, ..., 0.19, 0.20, ..., 0.29, ..., 0.90, ..., 0.99\} 90个数中,只有  \{0.25, 0.50, 0.75\} 3个数的二进制数是有限位的,其余 87个数的二进制数均为无穷位;

3.  ...

       从上可知,上述小数转换成二进制数时,成为无穷位的概率非常高;这样,对于该类数来说,二进制数被截断的概率极大。因此产生表示误差的可能性也极大,从而从统计学的角度看,产生表示误差的概率是接近100%。

  • 19
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值