差之毫厘谬以千里-计算中的精度问题

如果你只是i++来作计数器就可以跳过此post,主要是为进行大数据计算和与钱相关的计算的同志们写的,也许有谬误,欢迎批评指出
很多时候,绝大部分的大学生在参加工作后都是把计算机当作一个大型计算器一般的来写程序,譬如double a=12936/123546;,fine
当这个结果仅供娱乐,那么很幸运,你只需要继续使用就行了,但是再小的误差积累起来都是一个可怕的数字,而计算的误差对于计算
机来说,对于一般人潜意识里认为是精确的代名词的计算机来说却是家常便饭。很多时候我们意识到会有误差,但是都使用高精度的类型去弥补
但是对于很多情况下都还是不够,因为误差仍然是存在的,只是我们认为可以忽略了而已。
很多和钱打交道的计算都应该很注意误差对于计算的影响,比如曾经有部小说里描述过一种方法,有个黑客入侵了银行系统,他把每个帐户的余额都作了一次运算,由于计算的误差,每个帐户多了几厘钱,对于银行来说这几厘钱毫不起眼,但是他把所有帐户多出来的几厘钱汇入了自己的帐户,于是一个百万富翁就此诞生,而每个银行帐户上的钱都没有少。当然,小说是小说但是足够提起我们对于误差的重视
计算机里误差的原由其实很简单,计算机只能快速的搬动它的两根指头来计算,所以在计算机里,加减法是安全的,但是也仅仅对于整数而言,两个浮点数的计算就会因为浮点数本身的原因造成最后的几位存在疑问,当多次相加,误差就会累积起来,然后和滚雪球一样越来越大,浮点加减的误差按照线形增长,乘除就更加霸道了,会按照指数增长。而对于分数来说在计算机里只有1/2,1/4,1/8,1/16等1/2 的指数才是精确的,所以对于计算来说最好是可能的话把乘除都换算成等价的加减运算。抛砖引玉,到此为止......

你可能感兴趣的:(工作)