Files
sqlite3/ext/stats/moments.nogo
2025-01-20 14:39:36 +00:00

39 lines
767 B
Plaintext

package stats
import "math"
type moment struct {
m1, m2, m3, m4 kahan
n int64
}
func (w *moment) enqueue(x float64) {
n := w.n + 1
w.n = n
y := x - w.m1.hi - w.m1.lo
w.m1.add(y / float64(n))
y = math.FMA(y, x, -w.m2.hi) - w.m2.lo
w.m2.add(y / float64(n))
y = math.FMA(y, x, -w.m3.hi) - w.m3.lo
w.m3.add(y / float64(n))
y = math.FMA(y, x, -w.m4.hi) - w.m4.lo
w.m4.add(y / float64(n))
}
func (w *moment) dequeue(x float64) {
n := w.n - 1
if n <= 0 {
*w = moment{}
return
}
w.n = n
y := x - w.m1.hi + w.m1.lo
w.m1.sub(y / float64(n))
y = math.FMA(y, x, w.m2.hi) + w.m2.lo
w.m2.sub(y / float64(n))
y = math.FMA(y, x, w.m3.hi) + w.m3.lo
w.m3.sub(y / float64(n))
y = math.FMA(y, x, w.m4.hi) + w.m4.lo
w.m4.sub(y / float64(n))
}