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  }