各位大侠好,我在做R语言的计算的时候,遇到了一个问题,如下:
((0.81*0.1)+(0.09*(-0.9)))
上面的公式的计算结果本应该是0的,但是R语言给出了1.387779e-17这样的答案。
请各位大侠指导一下,感激不尽。
各位大侠好,我在做R语言的计算的时候,遇到了一个问题,如下:
((0.81*0.1)+(0.09*(-0.9)))
上面的公式的计算结果本应该是0的,但是R语言给出了1.387779e-17这样的答案。
请各位大侠指导一下,感激不尽。
浮点数运算需谨慎。。
> .3-.4+.4<br />
[1] 0.3<br />
> options(digits = 22)<br />
> .3-.4+.4<br />
[1] 0.2999999999999999888978
</p>浮点数计算是坑爹的。建议楼主找本数值计算的书看看。被坑过的人飘过。
奇怪啊,很正常的运算,为什么R会算错呢?
回复 第4楼 的 yangliping:浮点数的运算、比较,好像对于任何语言都是这样的。。
回复 第3楼 的 bigknife:好的,谢谢你啦。
回复 第1楼 的 he168:
网上搜了一下,高精度包Rmpfr可以解决这个问题。
<br />
>library(Rmpfr)<br />
> a=mpfr(c('.81','.1','.09','-.9'),200)<br />
> a[1]*a[2]+a[3]*a[4]<br />
1 'mpfr' number of precision 200 bits<br />
[1] 0<br />
</p>回复 第7楼 的 warrenzhang:
换过一组数据就出错了
> 0.3-0.4+0.4
[1] 0.3
> options(digits=20)
> 0.3-0.4+0.4
[1] 0.2999999999999999889
> a=mpfr(c('.3','.4','.3'),200)
> a[1]-a[2]+a[3]
1 'mpfr' number of precision 200 bits
[1] 0.20000000000000000000000000000000000000000000000000000000000019
> a=mpfr(c('.3','.4','.3'),100)
> a[1]-a[2]+a[3]
1 'mpfr' number of precision 100 bits
[1] 0.20000000000000000000000000000024
如果能保证计算结果永远为0.3?
通用语言中的浮点数都是按照 IEEE 754 标准实现的。 R 语言方面在这个事情上的处理思路上我是有点理解不了,面向应该用应该一步到位,暴露不同层级的抽象实在是让人很难过。
作为 Python 党我来捣乱:
Python 标准库中有 decimal 库,专门解决十进制精确计算问题。
<br />
In [1]: from decimal import Decimal as D</p>
<p>In [2]: D('0.3') - D('0.4') + D('0.4')<br />
Out[2]: Decimal('0.3')</p>
<p>In [3]: D('0.3') + D('0.4') - D('0.4')<br />
Out[3]: Decimal('0.3')<br />
</p>回复 第9楼 的 G_will:
木有用过这个软件
> a=0.3
> b=0.4
> c=a-b+b
> c
[1] 0.3
> options(digits=10)
> c1=a-b+b
> c1
[1] 0.3
> options(digits=16)
> c2=a-b+b
> c2
[1] 0.3
> options(digits=20)
> c3=a-b+b
> c3
[1] 0.2999999999999999889
> a1=round(a,digits=2)
> b1=round(b,digits=2)
> c4=a1-b1+b1
> c4
[1] 0.2999999999999999889
R确实是诡异
回复 第10楼 的 ywh19860616:不是诡异,是 R 的浮点数直接就是按照标准实现的,再加上 R 的精度设置,所以就这样了,蛋疼的是 R 既然面向应用就应该把这个封装起来,给用户与实际应用思维统一的抽象。
总之这是坑点,需牢记。
回复 第11楼 的 G_will:
恩,谢谢您的指导
真是矫枉过正啊,不按标准实现,自己搞一套实现反而成了正道了?
R 和 Python 的根本区别不在于面向「应用」,而在于面向科学和面向(软件)工程。何况就算是面向应用,也应该遵守标准实现。
回复 第13楼 的 肖楠:面向科学的标准是 IEEE 754 么?呵呵[s:11]。 那个,我只是随口提了一下 Python 中的 decimal 库,虽然 Python 中普通浮点数也是按标准实现的,像 Python 这种渣渣语言确实矫枉过正,由它去吧。我还是去研习宇宙第一语言 PHP 好了,有时间回头还得好好再学习 R 。
回复 第14楼 的 G_will:“宇宙第一语言”。。。[s:12]