yuanweir
一个小问题,可是的确很挠头[s:15]
x=rep(1/14,14)
sum(x)
1
sum(x)>=1 #sum直接求和
True
rep(1,14)%*%x
1
rep(1,14)%*%x>=1 #利用矩阵乘积计算求和
False
问题应该就是出在小数点后面'无穷远'的地方了,可是矩阵乘积只是乘了1,然后就是加和,所以感觉矩阵乘法并没有比sum会引入更多的无穷远问题的机会啊...
大家有没有想法?谢谢。
yanlinlin82
计算机在浮点数时,小数部分也是用二进制的(0.5、0.25、0.125、……),所以十进制的很多浮点数都是没法精确表示的。虽然相比我们平常用的double类型(64位),在CPU的内部会使用更高精度的寄存器(80位)来计算,一定程度上能够缓解精度表示问题,但是这并不能真正解决问题,尤其在比较浮点数相等时会比较明显。比如:
> 1 / 14 + 1 - 1 == 1 / 14
[1] FALSE
> .1 + .2 == .3
[1] FALSE
> 1e20 + 1000 == 1e20
[1] TRUE
所以这种问题的解决方法,就只能根据实际问题的需要来确定可以接受的精度,判断差值是否在该精度之内,如:
> abs((1 / 14 + 1 - 1) - (1 / 14)) < 1e-16
[1] TRUE
> abs((.1 + .2) - .3) < 1e-16
[1] TRUE
而对于上面的 1e20 + 1000,的确超出了一个double所能表示的真数的精度范围的,就只能另外想别的办法了。
yihui
R编程定律3:当你遇到奇怪的数值问题时,请参阅R FAQ 7.31,你将以95%的概率找到答案。
yuanweir
恩,明白~
谢谢提醒,数值算法的东西我真的还是了解不多,R FAQ 7.31都没找见过...一定好好补补功课哈