/
math.go
96 lines (84 loc) · 1.88 KB
/
math.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package vec8
import (
"github.com/duncanpierce/vector/constraintsExt"
"golang.org/x/exp/constraints"
"math"
)
func Add[Element constraintsExt.Number](m Bool, a, b [Length]Element) (r [Length]Element) {
m.ForTrue(func(i int) {
r[i] = a[i] + b[i]
})
return
}
func Sub[Element constraintsExt.Number](m Bool, a, b [Length]Element) (r [Length]Element) {
m.ForTrue(func(i int) {
r[i] = a[i] - b[i]
})
return
}
func Div[Element constraintsExt.Number](m Bool, a, b [Length]Element) (r [Length]Element) {
m.ForTrue(func(i int) {
r[i] = a[i] / b[i]
})
return
}
func Mul[Element constraintsExt.Number](m Bool, a, b [Length]Element) (r [Length]Element) {
m.ForTrue(func(i int) {
r[i] = a[i] * b[i]
})
return
}
func FMA[Element constraintsExt.Number](m Bool, a, b, c [Length]Element) (r [Length]Element) {
m.ForTrue(func(i int) {
r[i] = a[i]*b[i] + c[i]
})
return
}
func Neg[Element constraintsExt.Number](m Bool, a [Length]Element) (r [Length]Element) {
m.ForTrue(func(i int) {
r[i] = -a[i]
})
return
}
func Abs[Element constraintsExt.OrderedNumber](m Bool, a [Length]Element) (r [Length]Element) {
m.ForTrue(func(i int) {
v := a[i]
if v < 0 {
v = -v
}
r[i] = v
})
return
}
func Max[Element constraintsExt.OrderedNumber](m Bool, a, b [Length]Element) (r [Length]Element) {
m.ForTrue(func(i int) {
v := a[i]
if b[i] > v {
v = b[i]
}
r[i] = v
})
return
}
func Min[Element constraintsExt.OrderedNumber](m Bool, a, b [Length]Element) (r [Length]Element) {
m.ForTrue(func(i int) {
v := a[i]
if b[i] < v {
v = b[i]
}
r[i] = v
})
return
}
func IsInf[Element constraints.Float](m Bool, a [Length]Element, sign int) (r Bool) {
m.ForTrue(func(i int) {
r.Set(i, math.IsInf(float64(a[i]), sign))
})
return
}
func IsNaN[Element constraints.Float](m Bool, a [Length]Element) (r Bool) {
m.ForTrue(func(i int) {
r.Set(i, math.IsNaN(float64(a[i])))
})
return
}