golang中小数平方根的任意精度

Sal*_*ali 2 precision go

我正在寻找一种方法来计算一个任意精度的平方根(点后面的50位数).

在python中,使用Decimal可以轻松访问它:

from decimal import *
getcontext().prec = 50
Decimal(2).sqrt() # and here you go my 50 digits
Run Code Online (Sandbox Code Playgroud)

看到math/big我通过文档浏览后的力量,但没有发现任何类似的东西.

那么我唯一的选择是编写某种数值计算方法,它会迭代地尝试计算答案吗?

Sal*_*ali 5

这是我自己的平方根计算实现.在等待答案的同时,我决定尝试计算平方根方法.它有一大堆方法,但最后我找到了一个通过减法 pdf 的方形根链接 ,我真的很喜欢,因为算法的描述只有几行(我之前没有见过它)牛顿的方法).

所以这是我的实现(bigint在go中工作并不是很好):

func square(n int64, precision int64) string{
    ans_int := strconv.Itoa(int(math.Sqrt(float64(n))))

    limit   := new(big.Int).Exp(big.NewInt(10), big.NewInt(precision + 1), nil)
    a       := big.NewInt(5 * n)
    b       := big.NewInt(5)
    five    := big.NewInt(5)
    ten     := big.NewInt(10)
    hundred := big.NewInt(100)

    for b.Cmp(limit) < 0{
        if a.Cmp(b) < 0{
                a.Mul(a, hundred)
            tmp := new(big.Int).Div(b, ten)
            tmp.Mul(tmp, hundred)
            b.Add(tmp, five)
        } else {
            a.Sub(a, b)
            b.Add(b, ten)
        }
    }
    b.Div(b, hundred)

    ans_dec := b.String()

    return ans_dec[:len(ans_int)] + "." + ans_dec[len(ans_int):]
}
Run Code Online (Sandbox Code Playgroud)

PS谢谢Nick Craig-Wood用你惊人的评论来改善代码.

使用它,人们可以发现square(8537341, 50):

2921.8728582879851242173838229735693053765773170487

这只是来自python的最后一位数

getcontext().prec = 50
print str(Decimal(8537341).sqrt())
Run Code Online (Sandbox Code Playgroud)

2921.8728582879851242173838229735693053765773170488

这一位数是关闭的,因为最后一位数字并不精确.

一如既往Go Playground.

PS如果有人会找到一个本地方式来做这件事,我很乐意接受我的接受和upvote.

  • 以下是一些使用"math/big"更自然的东西.而不是`b.Cmp(limit)== -1`写'b.Cmp(limit)<0`,它让你知道你在测试什么,即`b <limit`.而不是'a = new(big.Int).Mul(a,百)`你可以写'a.Mul(a,百)`,这可以节省一些新的大in. (2认同)