这是我自己的平方根计算实现。在等待答案时,我决定尝试一下计算平方根的方法。它有很多方法,但最后我发现通过减法
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 = 50print str(Decimal(8537341).sqrt())
2921.8728582879851242173838229735693053765773170488
该数字不可用,因为最后一位数字不是很精确。
一如既往
[Go Playground](http://play.golang.org/p/u1CoB4cwXy)。
PS ,如果有人发现一个原生的方式来做到这一点,我很乐意给我的接受和给予好评。



