blob: 60ce6de245df2fd3f55a71c962391c28b53e9a24 [file] [log] [blame]
Russ Cox88daac72008-11-19 16:14:31 -08001// Copyright 2009 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
Russ Cox3b864e42009-08-12 13:18:37 -07005package math_test
Russ Cox88daac72008-11-19 16:14:31 -08006
7import (
Russ Coxa3382312009-11-15 12:57:09 -08008 "fmt";
Robert Griesemer3630bfb2009-11-05 09:08:08 -08009 . "math";
10 "testing";
Russ Cox88daac72008-11-19 16:14:31 -080011)
12
Russ Cox2c5ec1e2009-10-06 19:40:35 -070013var vf = []float64{
14 4.9790119248836735e+00,
15 7.7388724745781045e+00,
16 -2.7688005719200159e-01,
17 -5.0106036182710749e+00,
18 9.6362937071984173e+00,
19 2.9263772392439646e+00,
20 5.2290834314593066e+00,
21 2.7279399104360102e+00,
22 1.8253080916808550e+00,
23 -8.6859247685756013e+00,
Russ Coxbe2edb52009-03-03 08:39:12 -080024}
Russ Cox2c5ec1e2009-10-06 19:40:35 -070025var asin = []float64{
26 5.2117697218417440e-01,
27 8.8495619865825236e-01,
28 -2.7691544662819413e-02,
29 -5.2482360935268932e-01,
30 1.3002662421166553e+00,
31 2.9698415875871901e-01,
32 5.5025938468083364e-01,
33 2.7629597861677200e-01,
34 1.8355989225745148e-01,
35 -1.0523547536021498e+00,
Russ Coxbe2edb52009-03-03 08:39:12 -080036}
Russ Cox2c5ec1e2009-10-06 19:40:35 -070037var atan = []float64{
38 1.3725902621296217e+00,
39 1.4422906096452980e+00,
40 -2.7011324359471755e-01,
41 -1.3738077684543379e+00,
42 1.4673921193587666e+00,
43 1.2415173565870167e+00,
44 1.3818396865615167e+00,
45 1.2194305844639670e+00,
46 1.0696031952318783e+00,
47 -1.4561721938838085e+00,
Russ Coxbe2edb52009-03-03 08:39:12 -080048}
Russ Cox2c5ec1e2009-10-06 19:40:35 -070049var exp = []float64{
50 1.4533071302642137e+02,
51 2.2958822575694450e+03,
52 7.5814542574851666e-01,
53 6.6668778421791010e-03,
54 1.5310493273896035e+04,
55 1.8659907517999329e+01,
56 1.8662167355098713e+02,
57 1.5301332413189379e+01,
58 6.2047063430646876e+00,
59 1.6894712385826522e-04,
Russ Coxbe2edb52009-03-03 08:39:12 -080060}
Russ Cox2c5ec1e2009-10-06 19:40:35 -070061var floor = []float64{
62 4.0000000000000000e+00,
63 7.0000000000000000e+00,
64 -1.0000000000000000e+00,
65 -6.0000000000000000e+00,
66 9.0000000000000000e+00,
67 2.0000000000000000e+00,
68 5.0000000000000000e+00,
69 2.0000000000000000e+00,
70 1.0000000000000000e+00,
71 -9.0000000000000000e+00,
Russ Coxbe2edb52009-03-03 08:39:12 -080072}
Russ Cox2c5ec1e2009-10-06 19:40:35 -070073var log = []float64{
74 1.6052314626930630e+00,
75 2.0462560018708768e+00,
76 -1.2841708730962657e+00,
77 1.6115563905281544e+00,
78 2.2655365644872018e+00,
79 1.0737652208918380e+00,
80 1.6542360106073545e+00,
81 1.0035467127723465e+00,
82 6.0174879014578053e-01,
83 2.1617038728473527e+00,
Russ Coxbe2edb52009-03-03 08:39:12 -080084}
Russ Cox2c5ec1e2009-10-06 19:40:35 -070085var pow = []float64{
86 9.5282232631648415e+04,
87 5.4811599352999900e+07,
88 5.2859121715894400e-01,
89 9.7587991957286472e-06,
90 4.3280643293460450e+09,
91 8.4406761805034551e+02,
92 1.6946633276191194e+05,
93 5.3449040147551940e+02,
94 6.6881821384514159e+01,
95 2.0609869004248744e-09,
Russ Coxbe2edb52009-03-03 08:39:12 -080096}
Russ Cox2c5ec1e2009-10-06 19:40:35 -070097var sin = []float64{
98 -9.6466616586009283e-01,
99 9.9338225271646543e-01,
100 -2.7335587039794395e-01,
101 9.5586257685042800e-01,
102 -2.0994210667799692e-01,
103 2.1355787807998605e-01,
104 -8.6945689711673619e-01,
105 4.0195666811555783e-01,
106 9.6778633541688000e-01,
107 -6.7344058690503452e-01,
Russ Coxbe2edb52009-03-03 08:39:12 -0800108}
Russ Cox2c5ec1e2009-10-06 19:40:35 -0700109var sinh = []float64{
110 7.2661916084208533e+01,
111 1.1479409110035194e+03,
112 -2.8043136512812520e-01,
113 -7.4994290911815868e+01,
114 7.6552466042906761e+03,
115 9.3031583421672010e+00,
116 9.3308157558281088e+01,
117 7.6179893137269143e+00,
118 3.0217691805496156e+00,
119 -2.9595057572444951e+03,
Russ Coxbe2edb52009-03-03 08:39:12 -0800120}
Russ Cox2c5ec1e2009-10-06 19:40:35 -0700121var sqrt = []float64{
122 2.2313699659365484e+00,
123 2.7818829009464263e+00,
124 5.2619393496314792e-01,
125 2.2384377628763938e+00,
126 3.1042380236055380e+00,
127 1.7106657298385224e+00,
128 2.2867189227054791e+00,
129 1.6516476350711160e+00,
130 1.3510396336454586e+00,
131 2.9471892997524950e+00,
Russ Coxbe2edb52009-03-03 08:39:12 -0800132}
Russ Cox2c5ec1e2009-10-06 19:40:35 -0700133var tan = []float64{
134 -3.6613165650402277e+00,
135 8.6490023264859754e+00,
136 -2.8417941955033615e-01,
137 3.2532901859747287e+00,
138 2.1472756403802937e-01,
139 -2.1860091071106700e-01,
140 -1.7600028178723679e+00,
141 -4.3898089147528178e-01,
142 -3.8438855602011305e+00,
143 9.1098879337768517e-01,
Russ Coxbe2edb52009-03-03 08:39:12 -0800144}
Russ Cox2c5ec1e2009-10-06 19:40:35 -0700145var tanh = []float64{
146 9.9990531206936328e-01,
147 9.9999962057085307e-01,
148 -2.7001505097318680e-01,
149 -9.9991110943061700e-01,
150 9.9999999146798441e-01,
151 9.9427249436125233e-01,
152 9.9994257600983156e-01,
153 9.9149409509772863e-01,
154 9.4936501296239700e-01,
155 -9.9999994291374019e-01,
Russ Coxbe2edb52009-03-03 08:39:12 -0800156}
Russ Cox88daac72008-11-19 16:14:31 -0800157
Russ Cox2c5ec1e2009-10-06 19:40:35 -0700158func tolerance(a, b, e float64) bool {
Robert Griesemer3bb00322009-11-09 21:23:52 -0800159 d := a - b;
Russ Cox88daac72008-11-19 16:14:31 -0800160 if d < 0 {
Robert Griesemer40621d52009-11-09 12:07:39 -0800161 d = -d
Russ Cox88daac72008-11-19 16:14:31 -0800162 }
163
Russ Cox88daac72008-11-19 16:14:31 -0800164 if a != 0 {
Robert Griesemer3bb00322009-11-09 21:23:52 -0800165 e = e * a;
Russ Cox88daac72008-11-19 16:14:31 -0800166 if e < 0 {
Robert Griesemer40621d52009-11-09 12:07:39 -0800167 e = -e
Russ Cox88daac72008-11-19 16:14:31 -0800168 }
169 }
170 return d < e;
171}
Ken Thompsonbd80b5a2009-11-24 15:42:46 -0800172func kindaclose(a, b float64) bool { return tolerance(a, b, 1e-8) }
Robert Griesemer368f8cb2009-11-06 14:24:38 -0800173func close(a, b float64) bool { return tolerance(a, b, 1e-14) }
174func veryclose(a, b float64) bool { return tolerance(a, b, 4e-16) }
Russ Cox88daac72008-11-19 16:14:31 -0800175
Russ Cox839a6842009-01-20 14:40:40 -0800176func TestAsin(t *testing.T) {
Russ Cox88daac72008-11-19 16:14:31 -0800177 for i := 0; i < len(vf); i++ {
Robert Griesemer3bb00322009-11-09 21:23:52 -0800178 if f := Asin(vf[i] / 10); !veryclose(asin[i], f) {
Robert Griesemer40621d52009-11-09 12:07:39 -0800179 t.Errorf("Asin(%g) = %g, want %g\n", vf[i]/10, f, asin[i])
Russ Cox88daac72008-11-19 16:14:31 -0800180 }
181 }
182}
183
Russ Cox839a6842009-01-20 14:40:40 -0800184func TestAtan(t *testing.T) {
Russ Cox88daac72008-11-19 16:14:31 -0800185 for i := 0; i < len(vf); i++ {
Russ Cox04960402009-08-10 22:02:51 -0700186 if f := Atan(vf[i]); !veryclose(atan[i], f) {
Robert Griesemer40621d52009-11-09 12:07:39 -0800187 t.Errorf("Atan(%g) = %g, want %g\n", vf[i], f, atan[i])
Russ Cox88daac72008-11-19 16:14:31 -0800188 }
189 }
190}
191
Russ Cox839a6842009-01-20 14:40:40 -0800192func TestExp(t *testing.T) {
Russ Cox88daac72008-11-19 16:14:31 -0800193 for i := 0; i < len(vf); i++ {
Russ Cox04960402009-08-10 22:02:51 -0700194 if f := Exp(vf[i]); !veryclose(exp[i], f) {
Robert Griesemer40621d52009-11-09 12:07:39 -0800195 t.Errorf("Exp(%g) = %g, want %g\n", vf[i], f, exp[i])
Russ Cox88daac72008-11-19 16:14:31 -0800196 }
197 }
198}
199
Russ Cox839a6842009-01-20 14:40:40 -0800200func TestFloor(t *testing.T) {
Russ Cox88daac72008-11-19 16:14:31 -0800201 for i := 0; i < len(vf); i++ {
Russ Cox04960402009-08-10 22:02:51 -0700202 if f := Floor(vf[i]); floor[i] != f {
Robert Griesemer40621d52009-11-09 12:07:39 -0800203 t.Errorf("Floor(%g) = %g, want %g\n", vf[i], f, floor[i])
Russ Cox88daac72008-11-19 16:14:31 -0800204 }
205 }
206}
207
Russ Cox839a6842009-01-20 14:40:40 -0800208func TestLog(t *testing.T) {
Russ Cox88daac72008-11-19 16:14:31 -0800209 for i := 0; i < len(vf); i++ {
Russ Cox04960402009-08-10 22:02:51 -0700210 a := Fabs(vf[i]);
211 if f := Log(a); log[i] != f {
Robert Griesemer40621d52009-11-09 12:07:39 -0800212 t.Errorf("Log(%g) = %g, want %g\n", a, f, log[i])
Russ Cox88daac72008-11-19 16:14:31 -0800213 }
214 }
Russ Cox04960402009-08-10 22:02:51 -0700215 if f := Log(10); f != Ln10 {
Robert Griesemer40621d52009-11-09 12:07:39 -0800216 t.Errorf("Log(%g) = %g, want %g\n", 10, f, Ln10)
Russ Coxf379ea02008-11-20 10:54:02 -0800217 }
Russ Cox88daac72008-11-19 16:14:31 -0800218}
219
Russ Cox839a6842009-01-20 14:40:40 -0800220func TestPow(t *testing.T) {
Russ Cox88daac72008-11-19 16:14:31 -0800221 for i := 0; i < len(vf); i++ {
Russ Cox04960402009-08-10 22:02:51 -0700222 if f := Pow(10, vf[i]); !close(pow[i], f) {
Robert Griesemer40621d52009-11-09 12:07:39 -0800223 t.Errorf("Pow(10, %.17g) = %.17g, want %.17g\n", vf[i], f, pow[i])
Russ Cox88daac72008-11-19 16:14:31 -0800224 }
225 }
226}
227
Russ Cox839a6842009-01-20 14:40:40 -0800228func TestSin(t *testing.T) {
Russ Cox88daac72008-11-19 16:14:31 -0800229 for i := 0; i < len(vf); i++ {
Russ Cox04960402009-08-10 22:02:51 -0700230 if f := Sin(vf[i]); !close(sin[i], f) {
Robert Griesemer40621d52009-11-09 12:07:39 -0800231 t.Errorf("Sin(%g) = %g, want %g\n", vf[i], f, sin[i])
Russ Cox88daac72008-11-19 16:14:31 -0800232 }
233 }
234}
235
Russ Cox839a6842009-01-20 14:40:40 -0800236func TestSinh(t *testing.T) {
Russ Cox88daac72008-11-19 16:14:31 -0800237 for i := 0; i < len(vf); i++ {
Russ Cox04960402009-08-10 22:02:51 -0700238 if f := Sinh(vf[i]); !veryclose(sinh[i], f) {
Robert Griesemer40621d52009-11-09 12:07:39 -0800239 t.Errorf("Sinh(%g) = %g, want %g\n", vf[i], f, sinh[i])
Russ Cox88daac72008-11-19 16:14:31 -0800240 }
241 }
242}
243
Russ Cox839a6842009-01-20 14:40:40 -0800244func TestSqrt(t *testing.T) {
Russ Cox88daac72008-11-19 16:14:31 -0800245 for i := 0; i < len(vf); i++ {
Russ Cox04960402009-08-10 22:02:51 -0700246 a := Fabs(vf[i]);
247 if f := Sqrt(a); !veryclose(sqrt[i], f) {
Robert Griesemer40621d52009-11-09 12:07:39 -0800248 t.Errorf("Sqrt(%g) = %g, want %g\n", a, f, floor[i])
Russ Cox88daac72008-11-19 16:14:31 -0800249 }
250 }
251}
252
Russ Cox839a6842009-01-20 14:40:40 -0800253func TestTan(t *testing.T) {
Russ Cox88daac72008-11-19 16:14:31 -0800254 for i := 0; i < len(vf); i++ {
Russ Cox04960402009-08-10 22:02:51 -0700255 if f := Tan(vf[i]); !close(tan[i], f) {
Robert Griesemer40621d52009-11-09 12:07:39 -0800256 t.Errorf("Tan(%g) = %g, want %g\n", vf[i], f, tan[i])
Russ Cox88daac72008-11-19 16:14:31 -0800257 }
258 }
259}
260
Russ Cox839a6842009-01-20 14:40:40 -0800261func TestTanh(t *testing.T) {
Russ Cox88daac72008-11-19 16:14:31 -0800262 for i := 0; i < len(vf); i++ {
Russ Cox04960402009-08-10 22:02:51 -0700263 if f := Tanh(vf[i]); !veryclose(tanh[i], f) {
Robert Griesemer40621d52009-11-09 12:07:39 -0800264 t.Errorf("Tanh(%g) = %g, want %g\n", vf[i], f, tanh[i])
Russ Cox88daac72008-11-19 16:14:31 -0800265 }
266 }
267}
268
Russ Cox839a6842009-01-20 14:40:40 -0800269func TestHypot(t *testing.T) {
Russ Cox88daac72008-11-19 16:14:31 -0800270 for i := 0; i < len(vf); i++ {
Robert Griesemer3bb00322009-11-09 21:23:52 -0800271 a := Fabs(tanh[i] * Sqrt(2));
Russ Cox04960402009-08-10 22:02:51 -0700272 if f := Hypot(tanh[i], tanh[i]); !veryclose(a, f) {
Robert Griesemer40621d52009-11-09 12:07:39 -0800273 t.Errorf("Hypot(%g, %g) = %g, want %g\n", tanh[i], tanh[i], f, a)
Russ Cox88daac72008-11-19 16:14:31 -0800274 }
275 }
276}
Russ Coxa3382312009-11-15 12:57:09 -0800277
Ken Thompsonbd80b5a2009-11-24 15:42:46 -0800278// Check that math functions of high angle values
279// return similar results to low angle values
280func TestLargeSin(t *testing.T) {
281 large := float64(100000 * Pi);
282 for i := 0; i < len(vf); i++ {
283 f1 := Sin(vf[i]);
284 f2 := Sin(vf[i] + large);
285 if !kindaclose(f1, f2) {
286 t.Errorf("Sin(%g) = %g, want %g\n", vf[i]+large, f1, f2)
287 }
288 }
289}
290
291func TestLargeCos(t *testing.T) {
292 large := float64(100000 * Pi);
293 for i := 0; i < len(vf); i++ {
294 f1 := Cos(vf[i]);
295 f2 := Cos(vf[i] + large);
296 if !kindaclose(f1, f2) {
297 t.Errorf("Cos(%g) = %g, want %g\n", vf[i]+large, f1, f2)
298 }
299 }
300}
301
302
303func TestLargeTan(t *testing.T) {
304 large := float64(100000 * Pi);
305 for i := 0; i < len(vf); i++ {
306 f1 := Tan(vf[i]);
307 f2 := Tan(vf[i] + large);
308 if !kindaclose(f1, f2) {
309 t.Errorf("Tan(%g) = %g, want %g\n", vf[i]+large, f1, f2)
310 }
311 }
312}
313
Russ Coxa3382312009-11-15 12:57:09 -0800314// Check that math constants are accepted by compiler
315// and have right value (assumes strconv.Atof works).
316// http://code.google.com/p/go/issues/detail?id=201
317
318type floatTest struct {
319 val interface{};
320 name string;
321 str string;
322}
323
324var floatTests = []floatTest{
325 floatTest{float64(MaxFloat64), "MaxFloat64", "1.7976931348623157e+308"},
326 floatTest{float64(MinFloat64), "MinFloat64", "5e-324"},
327 floatTest{float32(MaxFloat32), "MaxFloat32", "3.4028235e+38"},
328 floatTest{float32(MinFloat32), "MinFloat32", "1e-45"},
329}
330
331func TestFloatMinMax(t *testing.T) {
332 for _, tt := range floatTests {
333 s := fmt.Sprint(tt.val);
334 if s != tt.str {
335 t.Errorf("Sprint(%v) = %s, want %s", tt.name, s, tt.str)
336 }
337 }
338}