【问题标题】:Ruby - Sqrt on a very large Integer cause Rounding issuesRuby - Sqrt 在一个非常大的整数上导致舍入问题
【发布时间】:2013-03-20 16:25:56
【问题描述】:

我正在尝试解决斐波那契问题,但遇到了舍入问题。

如果i = 8670007398507948658051921 那么fib1 = 19386725908489880000000000.0

我的代码如下 - 感谢您的帮助。

def is_fibonacci?(i)

  fib1 = Math.sqrt(5*(i**2)+4)
  fib2 = Math.sqrt(5*(i**2)-4)

  fib1 == fib1.round || fib2 == fib2.round ? true : false

end

【问题讨论】:

  • 您能更清楚地了解会发生什么吗?特别是,1.您使用此功能运行什么命令? 2. 结果如何?和 3. 你期望结果是什么,为什么?

标签: ruby rounding-error math.sqrt


【解决方案1】:

这样的 sqrt 对这么大的值不起作用,因为 sqrt 返回一个 Float 并且它的精度在这里不够用。我建议你实现自己的 sqrt 函数。有几种算法建议如何做到这一点,但我个人认为使用二进制搜索来计算函数的反向是最简单的:

def sqrt a
  begv = 1
  endv = a
  while endv > begv + 1
     mid = (endv + begv)/2
     if mid ** 2 <= a
        begv = mid
     else
        endv = mid
     end
  end
  return begv
end

或者,您可以尝试使用 BigDecimal 进行 sqrt(只需提高功率 0.5),但我更喜欢上述方法,因为它不涉及任何双重计算。

【讨论】:

  • 我尝试将其提高到 0.5 次方,但遇到了同样的问题。我会试试这个。
  • 这确实有效 - 尽管我认为我的 fib 方程可能是错误的。谢谢。
猜你喜欢
  • 2014-12-04
  • 2011-05-13
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多