代码之家  ›  专栏  ›  技术社区  ›  mpalanco

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

  •  4
  • mpalanco  · 技术社区  · 12 年前

    我用以下代码计算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

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

    我怎样才能绕过这个限制,得到R中准确的斐波那契数?

    2 回复  |  直到 12 年前
        1
  •  4
  •   Community Mohan Dere    6 年前

    感谢你对问题进行投票。我的声誉超过了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位,结果似乎精确到最后一位。

        2
  •  2
  •   Janhoo    12 年前

    您达到了双精度浮点运算的极限,精度为16位小数。这里你需要17英镑。AFAIK R没有更高精度的变量类型。

    要绕过此问题,您可能需要拆分操作数并分别求和。 解决这一问题的最先进方法是将操作数转换为字符,从后面解析它们,逐位相加,注意进位。

    推荐文章