【问题标题】:Inaccurate results calculating Fibonacci numbers in R在 R 中计算斐波那契数的结果不准确
【发布时间】:2014-04-25 17:43:43
【问题描述】:

我正在使用此代码计算 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 中获得准确的斐波那契数?

【问题讨论】:

  • 你试过print(fib(79), digits=20) 吗?
  • 是的,但我得到了相同的结果。

标签: r fibonacci


【解决方案1】:

您已达到精度为 16 位十进制数字的双精度浮点算术的极限。你确实需要 17 在这里。 AFAIK R 没有精度更高的变量类型。

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

【讨论】:

  • rwiki.sciviews.org/… 可能会有所帮助
  • 感谢大家为我指明正确的方向。我有一个使用 gmp 包的解决方案。但是,因为我的声望不到10,所以问了8小时后才发帖。
【解决方案2】:

感谢您为这个问题投票。我的声誉在 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 位,结果似乎精确到最后一位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-26
    • 2013-03-31
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 2012-12-03
    相关资源
    最近更新 更多