我正在寻找一种方法来计算一个任意精度的平方根(点后面的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我通过文档浏览后的力量,但没有发现任何类似的东西.
那么我唯一的选择是编写某种数值计算方法,它会迭代地尝试计算答案吗?
这是我自己的平方根计算实现.在等待答案的同时,我决定尝试计算平方根的方法.它有一大堆方法,但最后我找到了一个通过减法 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.