| // Copyright 2015 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package app | |
| import ( | |
| "math/rand" | |
| "testing" | |
| ) | |
| // Aeq returns true if expect and got are equal to 8 significant | |
| // figures (1 part in 100 million). | |
| func Aeq(expect, got float64) bool { | |
| if expect < 0 && got < 0 { | |
| expect, got = -expect, -got | |
| } | |
| return expect*0.99999999 <= got && got*0.99999999 <= expect | |
| } | |
| func TestMovingAverage(t *testing.T) { | |
| // Test MovingAverage against the obvious (but slow) | |
| // implementation. | |
| xs := make([]float64, 100) | |
| for iter := 0; iter < 10; iter++ { | |
| for i := range xs { | |
| xs[i] = rand.Float64() | |
| } | |
| m := 1 + 2*rand.Intn(100) | |
| ys1, ys2 := MovingAverage(xs, m), slowMovingAverage(xs, m) | |
| // TODO: Use stuff from mathtest. | |
| for i, y1 := range ys1 { | |
| if !Aeq(y1, ys2[i]) { | |
| t.Fatalf("want %v, got %v", ys2, ys1) | |
| } | |
| } | |
| } | |
| } | |
| func slowMovingAverage(xs []float64, m int) []float64 { | |
| ys := make([]float64, len(xs)) | |
| for i := range ys { | |
| psum, n := 0.0, 0 | |
| for j := i - (m-1)/2; j <= i+(m-1)/2; j++ { | |
| if 0 <= j && j < len(xs) { | |
| psum += xs[j] | |
| n++ | |
| } | |
| } | |
| ys[i] = psum / float64(n) | |
| } | |
| return ys | |
| } |