1// Copyright 2016 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// Tests whether the non vector routines are working, even when the tests are run on a
6// vector-capable machine.
7package math_test
8
9import (
10	. "math"
11	"testing"
12)
13
14func TestCosNovec(t *testing.T) {
15	if !HasVX {
16		t.Skipf("no vector support")
17	}
18	for i := 0; i < len(vf); i++ {
19		if f := CosNoVec(vf[i]); !veryclose(cos[i], f) {
20			t.Errorf("Cos(%g) = %g, want %g", vf[i], f, cos[i])
21		}
22	}
23	for i := 0; i < len(vfcosSC); i++ {
24		if f := CosNoVec(vfcosSC[i]); !alike(cosSC[i], f) {
25			t.Errorf("Cos(%g) = %g, want %g", vfcosSC[i], f, cosSC[i])
26		}
27	}
28}
29
30func TestCoshNovec(t *testing.T) {
31	if !HasVX {
32		t.Skipf("no vector support")
33	}
34	for i := 0; i < len(vf); i++ {
35		if f := CoshNoVec(vf[i]); !close(cosh[i], f) {
36			t.Errorf("Cosh(%g) = %g, want %g", vf[i], f, cosh[i])
37		}
38	}
39	for i := 0; i < len(vfcoshSC); i++ {
40		if f := CoshNoVec(vfcoshSC[i]); !alike(coshSC[i], f) {
41			t.Errorf("Cosh(%g) = %g, want %g", vfcoshSC[i], f, coshSC[i])
42		}
43	}
44}
45func TestSinNovec(t *testing.T) {
46	if !HasVX {
47		t.Skipf("no vector support")
48	}
49	for i := 0; i < len(vf); i++ {
50		if f := SinNoVec(vf[i]); !veryclose(sin[i], f) {
51			t.Errorf("Sin(%g) = %g, want %g", vf[i], f, sin[i])
52		}
53	}
54	for i := 0; i < len(vfsinSC); i++ {
55		if f := SinNoVec(vfsinSC[i]); !alike(sinSC[i], f) {
56			t.Errorf("Sin(%g) = %g, want %g", vfsinSC[i], f, sinSC[i])
57		}
58	}
59}
60
61func TestSinhNovec(t *testing.T) {
62	if !HasVX {
63		t.Skipf("no vector support")
64	}
65	for i := 0; i < len(vf); i++ {
66		if f := SinhNoVec(vf[i]); !close(sinh[i], f) {
67			t.Errorf("Sinh(%g) = %g, want %g", vf[i], f, sinh[i])
68		}
69	}
70	for i := 0; i < len(vfsinhSC); i++ {
71		if f := SinhNoVec(vfsinhSC[i]); !alike(sinhSC[i], f) {
72			t.Errorf("Sinh(%g) = %g, want %g", vfsinhSC[i], f, sinhSC[i])
73		}
74	}
75}
76
77// Check that math functions of high angle values
78// return accurate results. [Since (vf[i] + large) - large != vf[i],
79// testing for Trig(vf[i] + large) == Trig(vf[i]), where large is
80// a multiple of 2*Pi, is misleading.]
81func TestLargeCosNovec(t *testing.T) {
82	if !HasVX {
83		t.Skipf("no vector support")
84	}
85	large := float64(100000 * Pi)
86	for i := 0; i < len(vf); i++ {
87		f1 := cosLarge[i]
88		f2 := CosNoVec(vf[i] + large)
89		if !close(f1, f2) {
90			t.Errorf("Cos(%g) = %g, want %g", vf[i]+large, f2, f1)
91		}
92	}
93}
94
95func TestLargeSinNovec(t *testing.T) {
96	if !HasVX {
97		t.Skipf("no vector support")
98	}
99	large := float64(100000 * Pi)
100	for i := 0; i < len(vf); i++ {
101		f1 := sinLarge[i]
102		f2 := SinNoVec(vf[i] + large)
103		if !close(f1, f2) {
104			t.Errorf("Sin(%g) = %g, want %g", vf[i]+large, f2, f1)
105		}
106	}
107}
108
109func TestLargeTanNovec(t *testing.T) {
110	if !HasVX {
111		t.Skipf("no vector support")
112	}
113	large := float64(100000 * Pi)
114	for i := 0; i < len(vf); i++ {
115		f1 := tanLarge[i]
116		f2 := TanNovec(vf[i] + large)
117		if !close(f1, f2) {
118			t.Errorf("Tan(%g) = %g, want %g", vf[i]+large, f2, f1)
119		}
120	}
121}
122
123func TestTanNovec(t *testing.T) {
124	if !HasVX {
125		t.Skipf("no vector support")
126	}
127	for i := 0; i < len(vf); i++ {
128		if f := TanNovec(vf[i]); !veryclose(tan[i], f) {
129			t.Errorf("Tan(%g) = %g, want %g", vf[i], f, tan[i])
130		}
131	}
132	// same special cases as Sin
133	for i := 0; i < len(vfsinSC); i++ {
134		if f := TanNovec(vfsinSC[i]); !alike(sinSC[i], f) {
135			t.Errorf("Tan(%g) = %g, want %g", vfsinSC[i], f, sinSC[i])
136		}
137	}
138}
139
140func TestTanhNovec(t *testing.T) {
141	if !HasVX {
142		t.Skipf("no vector support")
143	}
144	for i := 0; i < len(vf); i++ {
145		if f := TanhNoVec(vf[i]); !veryclose(tanh[i], f) {
146			t.Errorf("Tanh(%g) = %g, want %g", vf[i], f, tanh[i])
147		}
148	}
149	for i := 0; i < len(vftanhSC); i++ {
150		if f := TanhNoVec(vftanhSC[i]); !alike(tanhSC[i], f) {
151			t.Errorf("Tanh(%g) = %g, want %g", vftanhSC[i], f, tanhSC[i])
152		}
153	}
154
155}
156
157func TestLog10Novec(t *testing.T) {
158	if !HasVX {
159		t.Skipf("no vector support")
160	}
161	for i := 0; i < len(vf); i++ {
162		a := Abs(vf[i])
163		if f := Log10NoVec(a); !veryclose(log10[i], f) {
164			t.Errorf("Log10(%g) = %g, want %g", a, f, log10[i])
165		}
166	}
167	if f := Log10NoVec(E); f != Log10E {
168		t.Errorf("Log10(%g) = %g, want %g", E, f, Log10E)
169	}
170	for i := 0; i < len(vflogSC); i++ {
171		if f := Log10NoVec(vflogSC[i]); !alike(logSC[i], f) {
172			t.Errorf("Log10(%g) = %g, want %g", vflogSC[i], f, logSC[i])
173		}
174	}
175}
176
177func TestLog1pNovec(t *testing.T) {
178	if !HasVX {
179		t.Skipf("no vector support")
180	}
181	for i := 0; i < len(vf); i++ {
182		a := vf[i] / 100
183		if f := Log1pNovec(a); !veryclose(log1p[i], f) {
184			t.Errorf("Log1p(%g) = %g, want %g", a, f, log1p[i])
185		}
186	}
187	a := 9.0
188	if f := Log1pNovec(a); f != Ln10 {
189		t.Errorf("Log1p(%g) = %g, want %g", a, f, Ln10)
190	}
191	for i := 0; i < len(vflogSC); i++ {
192		if f := Log1pNovec(vflog1pSC[i]); !alike(log1pSC[i], f) {
193			t.Errorf("Log1p(%g) = %g, want %g", vflog1pSC[i], f, log1pSC[i])
194		}
195	}
196}
197
198func TestAtanhNovec(t *testing.T) {
199	if !HasVX {
200		t.Skipf("no vector support")
201	}
202	for i := 0; i < len(vf); i++ {
203		a := vf[i] / 10
204		if f := AtanhNovec(a); !veryclose(atanh[i], f) {
205			t.Errorf("Atanh(%g) = %g, want %g", a, f, atanh[i])
206		}
207	}
208	for i := 0; i < len(vfatanhSC); i++ {
209		if f := AtanhNovec(vfatanhSC[i]); !alike(atanhSC[i], f) {
210			t.Errorf("Atanh(%g) = %g, want %g", vfatanhSC[i], f, atanhSC[i])
211		}
212	}
213}
214
215func TestAcosNovec(t *testing.T) {
216	if !HasVX {
217		t.Skipf("no vector support")
218	}
219	for i := 0; i < len(vf); i++ {
220		a := vf[i] / 10
221		if f := AcosNovec(a); !close(acos[i], f) {
222			t.Errorf("Acos(%g) = %g, want %g", a, f, acos[i])
223		}
224	}
225	for i := 0; i < len(vfacosSC); i++ {
226		if f := AcosNovec(vfacosSC[i]); !alike(acosSC[i], f) {
227			t.Errorf("Acos(%g) = %g, want %g", vfacosSC[i], f, acosSC[i])
228		}
229	}
230}
231
232func TestAsinNovec(t *testing.T) {
233	if !HasVX {
234		t.Skipf("no vector support")
235	}
236	for i := 0; i < len(vf); i++ {
237		a := vf[i] / 10
238		if f := AsinNovec(a); !veryclose(asin[i], f) {
239			t.Errorf("Asin(%g) = %g, want %g", a, f, asin[i])
240		}
241	}
242	for i := 0; i < len(vfasinSC); i++ {
243		if f := AsinNovec(vfasinSC[i]); !alike(asinSC[i], f) {
244			t.Errorf("Asin(%g) = %g, want %g", vfasinSC[i], f, asinSC[i])
245		}
246	}
247}
248
249func TestAcoshNovec(t *testing.T) {
250	if !HasVX {
251		t.Skipf("no vector support")
252	}
253	for i := 0; i < len(vf); i++ {
254		a := 1 + Abs(vf[i])
255		if f := AcoshNovec(a); !veryclose(acosh[i], f) {
256			t.Errorf("Acosh(%g) = %g, want %g", a, f, acosh[i])
257		}
258	}
259	for i := 0; i < len(vfacoshSC); i++ {
260		if f := AcoshNovec(vfacoshSC[i]); !alike(acoshSC[i], f) {
261			t.Errorf("Acosh(%g) = %g, want %g", vfacoshSC[i], f, acoshSC[i])
262		}
263	}
264}
265
266func TestAsinhNovec(t *testing.T) {
267	if !HasVX {
268		t.Skipf("no vector support")
269	}
270	for i := 0; i < len(vf); i++ {
271		if f := AsinhNovec(vf[i]); !veryclose(asinh[i], f) {
272			t.Errorf("Asinh(%g) = %g, want %g", vf[i], f, asinh[i])
273		}
274	}
275	for i := 0; i < len(vfasinhSC); i++ {
276		if f := AsinhNovec(vfasinhSC[i]); !alike(asinhSC[i], f) {
277			t.Errorf("Asinh(%g) = %g, want %g", vfasinhSC[i], f, asinhSC[i])
278		}
279	}
280}
281
282func TestErfNovec(t *testing.T) {
283	if !HasVX {
284		t.Skipf("no vector support")
285	}
286	for i := 0; i < len(vf); i++ {
287		a := vf[i] / 10
288		if f := ErfNovec(a); !veryclose(erf[i], f) {
289			t.Errorf("Erf(%g) = %g, want %g", a, f, erf[i])
290		}
291	}
292	for i := 0; i < len(vferfSC); i++ {
293		if f := ErfNovec(vferfSC[i]); !alike(erfSC[i], f) {
294			t.Errorf("Erf(%g) = %g, want %g", vferfSC[i], f, erfSC[i])
295		}
296	}
297}
298
299func TestErfcNovec(t *testing.T) {
300	if !HasVX {
301		t.Skipf("no vector support")
302	}
303	for i := 0; i < len(vf); i++ {
304		a := vf[i] / 10
305		if f := ErfcNovec(a); !veryclose(erfc[i], f) {
306			t.Errorf("Erfc(%g) = %g, want %g", a, f, erfc[i])
307		}
308	}
309	for i := 0; i < len(vferfcSC); i++ {
310		if f := ErfcNovec(vferfcSC[i]); !alike(erfcSC[i], f) {
311			t.Errorf("Erfc(%g) = %g, want %g", vferfcSC[i], f, erfcSC[i])
312		}
313	}
314}
315
316func TestAtanNovec(t *testing.T) {
317	if !HasVX {
318		t.Skipf("no vector support")
319	}
320	for i := 0; i < len(vf); i++ {
321		if f := AtanNovec(vf[i]); !veryclose(atan[i], f) {
322			t.Errorf("Atan(%g) = %g, want %g", vf[i], f, atan[i])
323		}
324	}
325	for i := 0; i < len(vfatanSC); i++ {
326		if f := AtanNovec(vfatanSC[i]); !alike(atanSC[i], f) {
327			t.Errorf("Atan(%g) = %g, want %g", vfatanSC[i], f, atanSC[i])
328		}
329	}
330}
331
332func TestAtan2Novec(t *testing.T) {
333	if !HasVX {
334		t.Skipf("no vector support")
335	}
336	for i := 0; i < len(vf); i++ {
337		if f := Atan2Novec(10, vf[i]); !veryclose(atan2[i], f) {
338			t.Errorf("Atan2(10, %g) = %g, want %g", vf[i], f, atan2[i])
339		}
340	}
341	for i := 0; i < len(vfatan2SC); i++ {
342		if f := Atan2Novec(vfatan2SC[i][0], vfatan2SC[i][1]); !alike(atan2SC[i], f) {
343			t.Errorf("Atan2(%g, %g) = %g, want %g", vfatan2SC[i][0], vfatan2SC[i][1], f, atan2SC[i])
344		}
345	}
346}
347
348func TestCbrtNovec(t *testing.T) {
349	if !HasVX {
350		t.Skipf("no vector support")
351	}
352	for i := 0; i < len(vf); i++ {
353		if f := CbrtNovec(vf[i]); !veryclose(cbrt[i], f) {
354			t.Errorf("Cbrt(%g) = %g, want %g", vf[i], f, cbrt[i])
355		}
356	}
357	for i := 0; i < len(vfcbrtSC); i++ {
358		if f := CbrtNovec(vfcbrtSC[i]); !alike(cbrtSC[i], f) {
359			t.Errorf("Cbrt(%g) = %g, want %g", vfcbrtSC[i], f, cbrtSC[i])
360		}
361	}
362}
363
364func TestLogNovec(t *testing.T) {
365	if !HasVX {
366		t.Skipf("no vector support")
367	}
368	for i := 0; i < len(vf); i++ {
369		a := Abs(vf[i])
370		if f := LogNovec(a); log[i] != f {
371			t.Errorf("Log(%g) = %g, want %g", a, f, log[i])
372		}
373	}
374	if f := LogNovec(10); f != Ln10 {
375		t.Errorf("Log(%g) = %g, want %g", 10.0, f, Ln10)
376	}
377	for i := 0; i < len(vflogSC); i++ {
378		if f := LogNovec(vflogSC[i]); !alike(logSC[i], f) {
379			t.Errorf("Log(%g) = %g, want %g", vflogSC[i], f, logSC[i])
380		}
381	}
382}
383
384func TestExpNovec(t *testing.T) {
385	if !HasVX {
386		t.Skipf("no vector support")
387	}
388	testExpNovec(t, Exp, "Exp")
389	testExpNovec(t, ExpGo, "ExpGo")
390}
391
392func testExpNovec(t *testing.T, Exp func(float64) float64, name string) {
393	for i := 0; i < len(vf); i++ {
394		if f := ExpNovec(vf[i]); !veryclose(exp[i], f) {
395			t.Errorf("%s(%g) = %g, want %g", name, vf[i], f, exp[i])
396		}
397	}
398	for i := 0; i < len(vfexpSC); i++ {
399		if f := ExpNovec(vfexpSC[i]); !alike(expSC[i], f) {
400			t.Errorf("%s(%g) = %g, want %g", name, vfexpSC[i], f, expSC[i])
401		}
402	}
403}
404
405func TestExpm1Novec(t *testing.T) {
406	if !HasVX {
407		t.Skipf("no vector support")
408	}
409	for i := 0; i < len(vf); i++ {
410		a := vf[i] / 100
411		if f := Expm1Novec(a); !veryclose(expm1[i], f) {
412			t.Errorf("Expm1(%g) = %g, want %g", a, f, expm1[i])
413		}
414	}
415	for i := 0; i < len(vf); i++ {
416		a := vf[i] * 10
417		if f := Expm1Novec(a); !close(expm1Large[i], f) {
418			t.Errorf("Expm1(%g) = %g, want %g", a, f, expm1Large[i])
419		}
420	}
421	for i := 0; i < len(vfexpm1SC); i++ {
422		if f := Expm1Novec(vfexpm1SC[i]); !alike(expm1SC[i], f) {
423			t.Errorf("Expm1(%g) = %g, want %g", vfexpm1SC[i], f, expm1SC[i])
424		}
425	}
426}
427
428func TestPowNovec(t *testing.T) {
429	if !HasVX {
430		t.Skipf("no vector support")
431	}
432	for i := 0; i < len(vf); i++ {
433		if f := PowNovec(10, vf[i]); !close(pow[i], f) {
434			t.Errorf("Pow(10, %g) = %g, want %g", vf[i], f, pow[i])
435		}
436	}
437	for i := 0; i < len(vfpowSC); i++ {
438		if f := PowNovec(vfpowSC[i][0], vfpowSC[i][1]); !alike(powSC[i], f) {
439			t.Errorf("Pow(%g, %g) = %g, want %g", vfpowSC[i][0], vfpowSC[i][1], f, powSC[i])
440		}
441	}
442}
443