【发布时间】:2018-07-06 15:05:33
【问题描述】:
我在互联网上搜索了一个函数来使用 scala 编程语言找到 BigInt 的精确平方根。我没有得到一个,但是看到了一个 Java 程序,我将该函数转换为 Scala 版本。它正在工作,但我不确定它是否可以处理非常大的 BigInt。但它只返回 BigInt。不是 BigDecimal 作为平方根。它表明在代码中进行了一些位操作,对数字进行了一些硬编码,例如shiftRight(5), BigInt("8") and shiftRight(1)。我可以清楚地理解逻辑,但不是这些位移数字和数字 8 的硬编码。可能是这些位移函数在 scala 中不可用,这就是为什么需要在少数地方转换为 java BigInteger 的原因。这些硬编码的数字可能会影响结果的精度。我只是将 java 代码更改为 scala 代码,只是复制了确切的算法。这是我用 scala 编写的代码:
def sqt(n:BigInt):BigInt = {
var a = BigInt(1)
var b = (n>>5)+BigInt(8)
while((b-a) >= 0) {
var mid:BigInt = (a+b)>>1
if(mid*mid-n> 0) b = mid-1
else a = mid+1
}
a-1
}
我的积分是:
- 我们不能返回 BigDecimal 而不是 BigInt 吗?我们该怎么做?
- 这些硬编码的数字
shiftRight(5), shiftRight(1) and 8是如何关联的 以精确到结果。
我在 scala REPL 中测试了一个数字:函数sqt 给出了平方数的精确平方根。但不是如下的实际数字:
scala> sqt(BigInt("19928937494873929279191794189"))
res9: BigInt = 141169888768369
scala> res9*res9
res10: scala.math.BigInt = 19928937494873675935734920161
scala> sqt(res10)
res11: BigInt = 141169888768369
scala>
我理解shiftRight(5) means divide by 2^5 ie.by 32 in decimal等等..但是为什么移位操作后在这里添加8?为什么正好是 5 个班次?作为第一个猜测?
【问题讨论】:
标签: scala square-root