【问题标题】:How do i get Math.Sqrt to return a Bignum and not a Float?如何让 Math.Sqrt 返回 Bignum 而不是 Float?
【发布时间】:2011-11-22 11:31:21
【问题描述】:

我正在尝试在 Ruby 中计算一个非常大的数字的平方根。我遇到的问题是 Math.sqrt 函数看起来像这样

sqrt(numeric) → float

如果我输入一个非常大的数字,它会给我 FloatDomainError: Infinity。

sqrt() 返回 BigNum 的最佳方法是什么?这可能有一个宝石,还是我必须编写自己的函数来计算平方根?

在这种情况下,最简单的方法是什么?泰勒级数?数字的平方根总是是整数。

【问题讨论】:

  • 哇,比Float::MAX #=> 1.79769313486232e+308还大?你是如何得到这么大的东西的?是否有任何中间点可以让您扎根?

标签: ruby floating-point bignum sqrt


【解决方案1】:

有一种简单的方法可以计算整数的平方根,从而得到一个整数:

  1. 要找到数字的平方根,请将 M 和 P 设置为该数字。
  2. 然后计算 (M+P/M)/2,将每个除法向下舍入。
  3. 如果 M 等于或小于结果,则使用 M 作为平方根; 否则,将 M 设置为结果并在第 2 步重复此过程。

不过,这种方法对于大数字可能效率低下,所以试试看吧。

编辑:

这是 Ruby 实现:

def mysqrt(x)
  return 0 if x==0 
  m=x
  p=x
  loop do
    r=(m+p/m)/2
    return m if m<=r
    m=r
  end
end

【讨论】:

  • 对于 sm 简单数字来说效果会很棒.. 比如说 9
  • @Baz1nga:不,这个公式与(m+p/m)/2 完全不同,会导致错误的结果。
  • 啊,还好你提醒了我!顺便说一句,对于那些不知道的人,这被称为牛顿法。它可以通过将其视为二分搜索来进一步优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多