计算R中斐波那契数的计算结果不准确

时间:2014-03-19 12:55:50

标签: r fibonacci

我用这段代码计算R中的斐波纳契数:

fib <- function(n) {
    a = 0
    b = 1      
  for (i  in 1:n) {
    tmp = b
    b = a
    a = a + tmp
  }
  return (a)
}
sprintf("%.0f",fib(79))

从fib(79)开始,我的结果不准确。例如:fib(79)=“14472334024676220”,根据此web,正确的结果应为:fib(79)= 14472334024676221

使用包numbers中的函数fibonacci,我得到了相同的不准确结果。我认为这是因为R中的数字精度。

如何绕过此限制并在R中获得准确的斐波纳契数?

2 个答案:

答案 0 :(得分:4)

感谢您投票。我的声誉超过10,所以我现在可以发布它:)。我使用包gmp(Ben Bolker提供的链接中提到的库)来获得一个非常简单的解决方案来总结大​​整数。

require(gmp)
fib <- function(n) {     
    a = 0
    b = 1    
  for (i  in 1:n) {
    tmp = b
    b = a
    a = add.bigz(a, tmp) # gmp function
  }
  return (a)
}
fib(79)

结果是正确的斐波纳契数,fib(79):14472334024676221。 我测试了更大的整数fib(5000),1045位数,结果似乎精确到最后一位数。

答案 1 :(得分:2)

你达到了双精度浮点算术的极限,它有16个十进制数字的精度。你这里需要17。 AFAIK R没有更高精度的变量类型。

要绕过此功能,您可能需要分别拆分操作数和总和。 最先进的方法是将操作数转换为字符,从后端解析,逐位添加,注意结转。