Home > Back-end >  Is there a simple method for square root of big.Rat?
Is there a simple method for square root of big.Rat?

Time:01-16

I need to find the square root of a big.Rat. Is there a way to do it without losing (already existing) accuracy?

For example, I could convert the numerator and denominator into floats, get the square root, and then convert it back...

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.

}

...but that would eliminate all of the accuracy of using a rational. Is there a better way of doing this?

CodePudding user response:

The big.Float type has a .Sqrt(x) operation, and handles defining explicitly the precision you aim for. I'd try to use that and convert the result back to a Rat with the same operations in your question, only manipulating big.Int values.

    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))

playground

  •  Tags:  
  • Related