gitee.com/quant1x/gox@v1.7.6/num/num32/vek_test.go (about) 1 package num32 2 3 import ( 4 "github.com/chewxy/math32" 5 "github.com/stretchr/testify/require" 6 "testing" 7 ) 8 9 const d = 0.001 10 11 var empty = []float32{} 12 var one = []float32{1} 13 var two = []float32{1, 2} 14 var eight = []float32{1, 2, 3, 4, 5, 6, 7, 8} // AVX register 15 var nine = []float32{1, 2, 3, 4, 5, 6, 7, 8, 9} 16 var accel = []bool{false, Info().Acceleration} 17 18 func TestSpecial(t *testing.T) { 19 for _, accel := range accel { 20 SetAcceleration(accel) 21 22 dst := make([]float32, 4) 23 24 require.Empty(t, Sin(empty)) 25 require.InDeltaSlice(t, []float32{0.8415}, Sin(one), d) 26 require.InDeltaSlice(t, []float32{0.8415, 0.9093, 0.1411, -0.7568, -0.9589, -0.2794, 0.6570, 0.9894}, Sin(eight), d) 27 require.InDeltaSlice(t, []float32{0.8415, 0.9093, 0.1411, -0.7568, -0.9589, -0.2794, 0.6570, 0.9894, 0.4121}, Sin(nine), d) 28 require.Panics(t, func() { Sin_Into(dst, nine) }) 29 30 require.Empty(t, Cos(empty)) 31 require.InDeltaSlice(t, Sin(AddNumber(one, math32.Pi/2)), Cos(one), d) 32 require.InDeltaSlice(t, Sin(AddNumber(eight, math32.Pi/2)), Cos(eight), d) 33 require.InDeltaSlice(t, Sin(AddNumber(nine, math32.Pi/2)), Cos(nine), d) 34 require.Panics(t, func() { Cos_Into(dst, nine) }) 35 36 const e = 0.001 37 38 require.Empty(t, Exp(empty)) 39 require.InEpsilonSlice(t, []float32{2.7183}, Exp(one), e) 40 require.InEpsilonSlice(t, []float32{2.7183, 7.3891, 20.0855, 54.5982, 148.4132, 403.4288, 1096.6332, 2980.9580}, Exp(eight), e) 41 require.InEpsilonSlice(t, []float32{2.7183, 7.3891, 20.0855, 54.5982, 148.4132, 403.4288, 1096.6332, 2980.9580, 8103.0839}, Exp(nine), e) 42 require.Panics(t, func() { Exp_Into(dst, nine) }) 43 44 require.Empty(t, Log(empty)) 45 require.True(t, math32.IsNaN(Log([]float32{-1})[0])) 46 require.InDeltaSlice(t, one, Log(Exp(one)), d) 47 require.InDeltaSlice(t, eight, Log(Exp(eight)), d) 48 require.InDeltaSlice(t, nine, Log(Exp(nine)), d) 49 require.Panics(t, func() { Log_Into(dst, nine) }) 50 51 invln2 := float32(1.4426950408889634) 52 invln10 := float32(0.4342944819032518) 53 54 require.Empty(t, Log2(empty)) 55 require.True(t, math32.IsNaN(Log2([]float32{-1})[0])) 56 require.InDeltaSlice(t, MulNumber(Log(one), invln2), Log2(one), d) 57 require.InDeltaSlice(t, MulNumber(Log(eight), invln2), Log2(eight), d) 58 require.InDeltaSlice(t, MulNumber(Log(nine), invln2), Log2(nine), d) 59 require.Panics(t, func() { Log2_Into(dst, nine) }) 60 61 require.Empty(t, Log10(empty)) 62 require.True(t, math32.IsNaN(Log10([]float32{-1})[0])) 63 require.InDeltaSlice(t, MulNumber(Log(one), invln10), Log10(one), d) 64 require.InDeltaSlice(t, MulNumber(Log(eight), invln10), Log10(eight), d) 65 require.InDeltaSlice(t, MulNumber(Log(nine), invln10), Log10(nine), d) 66 require.Panics(t, func() { Log10_Into(dst, nine) }) 67 } 68 } 69 70 func TestConstruction(t *testing.T) { 71 for _, accel := range accel { 72 SetAcceleration(accel) 73 74 dst := make([]float32, 4) 75 76 require.Equal(t, empty, FromFloat64([]float64{})) 77 require.Equal(t, []float32{5}, FromFloat64([]float64{5})) 78 require.Equal(t, []float32{5, -5}, FromFloat64([]float64{5, -5})) 79 require.Equal(t, []float32{5, -5, 5, 1}, FromFloat64([]float64{5, -5, 5, 1})) 80 require.Equal(t, []float32{5, -5, 5, 1, 0}, FromFloat64([]float64{5, -5, 5, 1, 0})) 81 require.Panics(t, func() { FromFloat64_Into(dst, []float64{1, 2, 3, 4, 5}) }) 82 } 83 }