mirror of
https://github.com/ncruces/go-sqlite3.git
synced 2026-01-12 05:59:14 +00:00
39 lines
767 B
Plaintext
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))
|
|
}
|