big.Rat 的平方根有简单的方法吗?
Is there a simple method for square root of big.Rat?
我需要求 big.Rat 的平方根。 有没有办法在不损失(已经存在的)精度的情况下做到这一点?
例如,我可以将分子和分母转换成浮点数,得到平方根,然后再转换回来...
func ratSquareRoot(num *big.Rat) *big.Rat {
f, exact := num.Float64() //Yuck! Floats!
squareRoot := math.Sqrt(f)
var accuracy int64 = 10 ^ 15 //Significant digits of precision for float64
return big.NewRat(int64(squareRoot*float64(accuracy)), accuracy)
// ^ This is now totally worthless. And also probably not simplified very well.
}
...但这会消除使用有理数的所有准确性。 有更好的方法吗?
big.Float
类型有一个 .Sqrt(x)
操作,并处理明确定义您的目标精度。我会尝试使用它并将结果转换回 Rat
,并在您的问题中使用相同的操作,仅操纵 big.Int
值。
r := big.NewRat(1, 3)
var x big.Float
x.SetPrec(30) // I didn't figure out the 'Prec' part correctly, read the docs more carefully than I did and experiement
x.SetRat(r)
var s big.Float
s.SetPrec(15)
s.Sqrt(&x)
r, _ = s.Rat(nil)
fmt.Println(x.String(), s.String())
fmt.Println(r.String(), float64(18919)/float64(32768))
我需要求 big.Rat 的平方根。 有没有办法在不损失(已经存在的)精度的情况下做到这一点?
例如,我可以将分子和分母转换成浮点数,得到平方根,然后再转换回来...
func ratSquareRoot(num *big.Rat) *big.Rat {
f, exact := num.Float64() //Yuck! Floats!
squareRoot := math.Sqrt(f)
var accuracy int64 = 10 ^ 15 //Significant digits of precision for float64
return big.NewRat(int64(squareRoot*float64(accuracy)), accuracy)
// ^ This is now totally worthless. And also probably not simplified very well.
}
...但这会消除使用有理数的所有准确性。 有更好的方法吗?
big.Float
类型有一个 .Sqrt(x)
操作,并处理明确定义您的目标精度。我会尝试使用它并将结果转换回 Rat
,并在您的问题中使用相同的操作,仅操纵 big.Int
值。
r := big.NewRat(1, 3)
var x big.Float
x.SetPrec(30) // I didn't figure out the 'Prec' part correctly, read the docs more carefully than I did and experiement
x.SetRat(r)
var s big.Float
s.SetPrec(15)
s.Sqrt(&x)
r, _ = s.Rat(nil)
fmt.Println(x.String(), s.String())
fmt.Println(r.String(), float64(18919)/float64(32768))