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

萨尔瓦多·达利(Salvador Dali):

我正在寻找一种以任意精度(例如点后50位数左右)计算平方根的方法。

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

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

看到强大的功能后,math/big我浏览了文档,但没有发现任何类似的内容。

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

萨尔瓦多·达利(Salvador Dali):

这是我自己的平方根计算实现。在等待答案时,我决定尝试一下计算平方根方法它有很多方法,但是最后我发现通过减法 pdf 链接到平方根的链接,我真的很喜欢,因为算法的描述只有几行(相比之下,我之前从未见过)牛顿的方法)。

所以这是我的实现(bigint不能很好地配合使用):

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):]
}

PS感谢您Nick Nickig-Wood用您的惊人注释使代码更好。

并使用它可以发现square(8537341, 50)

2921.8728582879851242173838229735693053765773170487

这只是python的最后一位

getcontext().prec = 50
print str(Decimal(8537341).sqrt())

2921.8728582879851242173838229735693053765773170488

该数字不可用,因为最后一位数字不是很精确。

一如既往Go Playground

PS,如果有人发现一个原生的方式来做到这一点,我很乐意给我的接受和给予好评。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档