美文网首页
计算机误差之谜

计算机误差之谜

作者: 绝露 | 来源:发表于2017-03-12 20:53 被阅读0次

问题的由来

对于这件事情的思考,开始工作上碰到一个问题。
具体问题如下(简化后):

public static void main(String[] args) {
        double d0 = 0.2;
        double d1 = d0 + 0.01;
        System.out.println(d1);
}

本来以为一个很简单的问题。结果计算机却输出了:
0.21000000000000002
人家说,进步往往来源于例外。看来,这是我进步的一次机会,哈哈!。

问题的根源

先抛出答案:二进制数本身表达能力的局限性。
为什么会这样? 先来给你演示一下:
二进制如何表示十进制:


binary.png
如二进制的10.101 表示为十进制就是:

所以,十进制的0.1,用二进制来表示,只能用如下方式:![](http://latex.codecogs.com/png.latex?\inline&space;\frac{1}{16}+\frac{1}{32}+\frac{1}{256}+\frac{1}{512}+\frac{1}{1024}. . .)
你会发现 . . .之后会有无穷多的数。
所以在十进制数中很简单的0.1,在二进制数中就是不能精确表达。
其实这个情况也很好理解,毕竟计数系统是一种符号化语言。而只要是语言就有其缺陷。十进制也有不能精确表达的数,比如无理数,无限循环小数。再如自然语言也有其缺陷之处。中文“鲜”的含义在英文中就找不到一个完美的表达。

问题的处理办法

计数系统在表达小数方面都有其缺陷。但是对于整数,都是可以精确表达的。如果我们可以把小数用整数来表示,这个问题不就解决了吗?
如何用整数来表示小数?
当你试着用一对一的方式去表达的时候,你会发现这是行不通的。所以我们用两个整数来表达一个小数。如:



这样的话十进制的0.1,就可被我们用1和-1来表示了。
这个处理办法在java语言中用BigDecimal实现。

相关文章

  • 计算机误差之谜

    问题的由来 对于这件事情的思考,开始工作上碰到一个问题。具体问题如下(简化后): 本来以为一个很简单的问题。结果计...

  • 花书 四 数值计算

    上溢和下溢 计算机中在表示实数时候存在的误差。一种近似误差是舍入误差。这种舍入误差指的是,指运算得到的近似值和精确...

  • 2018-01-24

    第一课:为什么计算机视觉能够发展迅速 大数据以及算法开发将会使智能系统的测试误差逐渐趋近于贝叶斯最优误差。这个结果...

  • 玛雅文明之谜

    玛雅文明之谜 玛雅人把一年分为18个月,他们测算的地球年为365.2420天,现代人测算为365.2422天,误差...

  • 误差与评估方法

    机器学习误差: 训练误差或者经验误差:学习器在训练集上的误差 泛化误差:在新样本上的误差 评估方法: ...

  • 海东大萨比

    0 误差, 0.28571428571429<= 1%误差,46.4%<=5% 误差, 53.57%

  • 泛化误差和经验误差

    泛化误差 学习器在新样本上的误差。 经验误差 学习器在训练集上的误差,又称经验误差。

  • 《机器学习》第二章模型评估与选择

    1.经验误差与过拟合 把学习器在训练集上的误差称为“训练误差”或“经验误差”,而在新样本上的误差称为“泛化误差”。...

  • 差分定位原理

    GPS定位测量中的三类误差: 1、接收机的公有误差:卫星钟误差、星历误差、电离层误差、对流程误差; 2、接收机自身...

  • 模型的过分拟合

    分类模型的误差大致分为两种:训练误差和泛化误差。训练误差也称为再代入误差或表现误差,是在训练记录上误分类样本比例,...

网友评论

      本文标题:计算机误差之谜

      本文链接:https://www.haomeiwen.com/subject/hhytnttx.html