2
0
mirror of https://github.com/42wim/matterbridge synced 2024-11-07 09:20:23 +00:00
matterbridge/vendor/github.com/av-elier/go-decimal-to-rational/frac.go
Benau 53cafa9f3d
Convert .tgs with go libraries (and cgo) (telegram) (#1569)
This commit adds support for go/cgo tgs conversion when building with the -tags `cgo`
The default binaries are still "pure" go and uses the old way of converting.

* Move lottie_convert.py conversion code to its own file

* Add optional libtgsconverter

* Update vendor

* Apply suggestions from code review

* Update bridge/helper/libtgsconverter.go

Co-authored-by: Wim <wim@42.be>
2021-08-24 22:32:50 +02:00

45 lines
1.2 KiB
Go

package dectofrac
import (
"math"
"math/big"
)
// MaxIterations is some sane limit of iterations for precision mode
const MaxIterations = 5000
// NewRatI returns rational from decimal
// using `iterations` number of iterations in Continued Fraction algorythm
func NewRatI(val float64, iterations int64) *big.Rat {
return NewRat(val, iterations, 0)
}
// NewRatP returns rational from decimal
// by going as mush iterations, until next fraction is less than `stepPrecision`
func NewRatP(val float64, stepPrecision float64) *big.Rat {
return NewRat(val, MaxIterations, stepPrecision)
}
func NewRat(val float64, iterations int64, stepPrecision float64) *big.Rat {
a0 := int64(math.Floor(val))
x0 := val - float64(a0)
rat := cf(x0, 1, iterations, stepPrecision)
return rat.Add(rat, new(big.Rat).SetInt64(a0))
}
func cf(xi float64, i int64, limit int64, stepPrecision float64) *big.Rat {
if i >= limit || xi <= stepPrecision {
return big.NewRat(0, 1)
}
inverted := 1 / xi
aj := int64(math.Floor(inverted))
xj := inverted - float64(aj)
ratAJ := new(big.Rat).SetInt64(aj)
ratNext := cf(xj, i+1, limit, stepPrecision)
res := ratAJ.Add(ratAJ, ratNext)
res = res.Inv(res)
return res
}