Source file
src/math/cmplx/cmath_test.go
1
2
3
4
5 package cmplx
6
7 import (
8 "math"
9 "testing"
10 )
11
12
13
14
15 var vc26 = []complex128{
16 (4.97901192488367350108546816 + 7.73887247457810456552351752i),
17 (7.73887247457810456552351752 - 0.27688005719200159404635997i),
18 (-0.27688005719200159404635997 - 5.01060361827107492160848778i),
19 (-5.01060361827107492160848778 + 9.63629370719841737980004837i),
20 (9.63629370719841737980004837 + 2.92637723924396464525443662i),
21 (2.92637723924396464525443662 + 5.22908343145930665230025625i),
22 (5.22908343145930665230025625 + 2.72793991043601025126008608i),
23 (2.72793991043601025126008608 + 1.82530809168085506044576505i),
24 (1.82530809168085506044576505 - 8.68592476857560136238589621i),
25 (-8.68592476857560136238589621 + 4.97901192488367350108546816i),
26 }
27
28 var vc = []complex128{
29 (4.9790119248836735e+00 + 7.7388724745781045e+00i),
30 (7.7388724745781045e+00 - 2.7688005719200159e-01i),
31 (-2.7688005719200159e-01 - 5.0106036182710749e+00i),
32 (-5.0106036182710749e+00 + 9.6362937071984173e+00i),
33 (9.6362937071984173e+00 + 2.9263772392439646e+00i),
34 (2.9263772392439646e+00 + 5.2290834314593066e+00i),
35 (5.2290834314593066e+00 + 2.7279399104360102e+00i),
36 (2.7279399104360102e+00 + 1.8253080916808550e+00i),
37 (1.8253080916808550e+00 - 8.6859247685756013e+00i),
38 (-8.6859247685756013e+00 + 4.9790119248836735e+00i),
39 }
40
41
42
43
44
45
46
47 var abs = []float64{
48 9.2022120669932650313380972e+00,
49 7.7438239742296106616261394e+00,
50 5.0182478202557746902556648e+00,
51 1.0861137372799545160704002e+01,
52 1.0070841084922199607011905e+01,
53 5.9922447613166942183705192e+00,
54 5.8978784056736762299945176e+00,
55 3.2822866700678709020367184e+00,
56 8.8756430028990417290744307e+00,
57 1.0011785496777731986390856e+01,
58 }
59
60 var acos = []complex128{
61 (1.0017679804707456328694569 - 2.9138232718554953784519807i),
62 (0.03606427612041407369636057 + 2.7358584434576260925091256i),
63 (1.6249365462333796703711823 + 2.3159537454335901187730929i),
64 (2.0485650849650740120660391 - 3.0795576791204117911123886i),
65 (0.29621132089073067282488147 - 3.0007392508200622519398814i),
66 (1.0664555914934156601503632 - 2.4872865024796011364747111i),
67 (0.48681307452231387690013905 - 2.463655912283054555225301i),
68 (0.6116977071277574248407752 - 1.8734458851737055262693056i),
69 (1.3649311280370181331184214 + 2.8793528632328795424123832i),
70 (2.6189310485682988308904501 - 2.9956543302898767795858704i),
71 }
72 var acosh = []complex128{
73 (2.9138232718554953784519807 + 1.0017679804707456328694569i),
74 (2.7358584434576260925091256 - 0.03606427612041407369636057i),
75 (2.3159537454335901187730929 - 1.6249365462333796703711823i),
76 (3.0795576791204117911123886 + 2.0485650849650740120660391i),
77 (3.0007392508200622519398814 + 0.29621132089073067282488147i),
78 (2.4872865024796011364747111 + 1.0664555914934156601503632i),
79 (2.463655912283054555225301 + 0.48681307452231387690013905i),
80 (1.8734458851737055262693056 + 0.6116977071277574248407752i),
81 (2.8793528632328795424123832 - 1.3649311280370181331184214i),
82 (2.9956543302898767795858704 + 2.6189310485682988308904501i),
83 }
84 var asin = []complex128{
85 (0.56902834632415098636186476 + 2.9138232718554953784519807i),
86 (1.5347320506744825455349611 - 2.7358584434576260925091256i),
87 (-0.054140219438483051139860579 - 2.3159537454335901187730929i),
88 (-0.47776875817017739283471738 + 3.0795576791204117911123886i),
89 (1.2745850059041659464064402 + 3.0007392508200622519398814i),
90 (0.50434073530148095908095852 + 2.4872865024796011364747111i),
91 (1.0839832522725827423311826 + 2.463655912283054555225301i),
92 (0.9590986196671391943905465 + 1.8734458851737055262693056i),
93 (0.20586519875787848611290031 - 2.8793528632328795424123832i),
94 (-1.0481347217734022116591284 + 2.9956543302898767795858704i),
95 }
96 var asinh = []complex128{
97 (2.9113760469415295679342185 + 0.99639459545704326759805893i),
98 (2.7441755423994259061579029 - 0.035468308789000500601119392i),
99 (-2.2962136462520690506126678 - 1.5144663565690151885726707i),
100 (-3.0771233459295725965402455 + 1.0895577967194013849422294i),
101 (3.0048366100923647417557027 + 0.29346979169819220036454168i),
102 (2.4800059370795363157364643 + 1.0545868606049165710424232i),
103 (2.4718773838309585611141821 + 0.47502344364250803363708842i),
104 (1.8910743588080159144378396 + 0.56882925572563602341139174i),
105 (2.8735426423367341878069406 - 1.362376149648891420997548i),
106 (-2.9981750586172477217567878 + 0.5183571985225367505624207i),
107 }
108 var atan = []complex128{
109 (1.5115747079332741358607654 + 0.091324403603954494382276776i),
110 (1.4424504323482602560806727 - 0.0045416132642803911503770933i),
111 (-1.5593488703630532674484026 - 0.20163295409248362456446431i),
112 (-1.5280619472445889867794105 + 0.081721556230672003746956324i),
113 (1.4759909163240799678221039 + 0.028602969320691644358773586i),
114 (1.4877353772046548932715555 + 0.14566877153207281663773599i),
115 (1.4206983927779191889826 + 0.076830486127880702249439993i),
116 (1.3162236060498933364869556 + 0.16031313000467530644933363i),
117 (1.5473450684303703578810093 - 0.11064907507939082484935782i),
118 (-1.4841462340185253987375812 + 0.049341850305024399493142411i),
119 }
120 var atanh = []complex128{
121 (0.058375027938968509064640438 + 1.4793488495105334458167782i),
122 (0.12977343497790381229915667 - 1.5661009410463561327262499i),
123 (-0.010576456067347252072200088 - 1.3743698658402284549750563i),
124 (-0.042218595678688358882784918 + 1.4891433968166405606692604i),
125 (0.095218997991316722061828397 + 1.5416884098777110330499698i),
126 (0.079965459366890323857556487 + 1.4252510353873192700350435i),
127 (0.15051245471980726221708301 + 1.4907432533016303804884461i),
128 (0.25082072933993987714470373 + 1.392057665392187516442986i),
129 (0.022896108815797135846276662 - 1.4609224989282864208963021i),
130 (-0.08665624101841876130537396 + 1.5207902036935093480142159i),
131 }
132 var conj = []complex128{
133 (4.9790119248836735e+00 - 7.7388724745781045e+00i),
134 (7.7388724745781045e+00 + 2.7688005719200159e-01i),
135 (-2.7688005719200159e-01 + 5.0106036182710749e+00i),
136 (-5.0106036182710749e+00 - 9.6362937071984173e+00i),
137 (9.6362937071984173e+00 - 2.9263772392439646e+00i),
138 (2.9263772392439646e+00 - 5.2290834314593066e+00i),
139 (5.2290834314593066e+00 - 2.7279399104360102e+00i),
140 (2.7279399104360102e+00 - 1.8253080916808550e+00i),
141 (1.8253080916808550e+00 + 8.6859247685756013e+00i),
142 (-8.6859247685756013e+00 - 4.9790119248836735e+00i),
143 }
144 var cos = []complex128{
145 (3.024540920601483938336569e+02 + 1.1073797572517071650045357e+03i),
146 (1.192858682649064973252758e-01 + 2.7857554122333065540970207e-01i),
147 (7.2144394304528306603857962e+01 - 2.0500129667076044169954205e+01i),
148 (2.24921952538403984190541e+03 - 7.317363745602773587049329e+03i),
149 (-9.148222970032421760015498e+00 + 1.953124661113563541862227e+00i),
150 (-9.116081175857732248227078e+01 - 1.992669213569952232487371e+01i),
151 (3.795639179042704640002918e+00 + 6.623513350981458399309662e+00i),
152 (-2.9144840732498869560679084e+00 - 1.214620271628002917638748e+00i),
153 (-7.45123482501299743872481e+02 + 2.8641692314488080814066734e+03i),
154 (-5.371977967039319076416747e+01 + 4.893348341339375830564624e+01i),
155 }
156 var cosh = []complex128{
157 (8.34638383523018249366948e+00 + 7.2181057886425846415112064e+01i),
158 (1.10421967379919366952251e+03 - 3.1379638689277575379469861e+02i),
159 (3.051485206773701584738512e-01 - 2.6805384730105297848044485e-01i),
160 (-7.33294728684187933370938e+01 + 1.574445942284918251038144e+01i),
161 (-7.478643293945957535757355e+03 + 1.6348382209913353929473321e+03i),
162 (4.622316522966235701630926e+00 - 8.088695185566375256093098e+00i),
163 (-8.544333183278877406197712e+01 + 3.7505836120128166455231717e+01i),
164 (-1.934457815021493925115198e+00 + 7.3725859611767228178358673e+00i),
165 (-2.352958770061749348353548e+00 - 2.034982010440878358915409e+00i),
166 (7.79756457532134748165069e+02 + 2.8549350716819176560377717e+03i),
167 }
168 var exp = []complex128{
169 (1.669197736864670815125146e+01 + 1.4436895109507663689174096e+02i),
170 (2.2084389286252583447276212e+03 - 6.2759289284909211238261917e+02i),
171 (2.227538273122775173434327e-01 + 7.2468284028334191250470034e-01i),
172 (-6.5182985958153548997881627e-03 - 1.39965837915193860879044e-03i),
173 (-1.4957286524084015746110777e+04 + 3.269676455931135688988042e+03i),
174 (9.218158701983105935659273e+00 - 1.6223985291084956009304582e+01i),
175 (-1.7088175716853040841444505e+02 + 7.501382609870410713795546e+01i),
176 (-3.852461315830959613132505e+00 + 1.4808420423156073221970892e+01i),
177 (-4.586775503301407379786695e+00 - 4.178501081246873415144744e+00i),
178 (4.451337963005453491095747e-05 - 1.62977574205442915935263e-04i),
179 }
180 var log = []complex128{
181 (2.2194438972179194425697051e+00 + 9.9909115046919291062461269e-01i),
182 (2.0468956191154167256337289e+00 - 3.5762575021856971295156489e-02i),
183 (1.6130808329853860438751244e+00 - 1.6259990074019058442232221e+00i),
184 (2.3851910394823008710032651e+00 + 2.0502936359659111755031062e+00i),
185 (2.3096442270679923004800651e+00 + 2.9483213155446756211881774e-01i),
186 (1.7904660933974656106951860e+00 + 1.0605860367252556281902109e+00i),
187 (1.7745926939841751666177512e+00 + 4.8084556083358307819310911e-01i),
188 (1.1885403350045342425648780e+00 + 5.8969634164776659423195222e-01i),
189 (2.1833107837679082586772505e+00 - 1.3636647724582455028314573e+00i),
190 (2.3037629487273259170991671e+00 + 2.6210913895386013290915234e+00i),
191 }
192 var log10 = []complex128{
193 (9.6389223745559042474184943e-01 + 4.338997735671419492599631e-01i),
194 (8.8895547241376579493490892e-01 - 1.5531488990643548254864806e-02i),
195 (7.0055210462945412305244578e-01 - 7.0616239649481243222248404e-01i),
196 (1.0358753067322445311676952e+00 + 8.9043121238134980156490909e-01i),
197 (1.003065742975330237172029e+00 + 1.2804396782187887479857811e-01i),
198 (7.7758954439739162532085157e-01 + 4.6060666333341810869055108e-01i),
199 (7.7069581462315327037689152e-01 + 2.0882857371769952195512475e-01i),
200 (5.1617650901191156135137239e-01 + 2.5610186717615977620363299e-01i),
201 (9.4819982567026639742663212e-01 - 5.9223208584446952284914289e-01i),
202 (1.0005115362454417135973429e+00 + 1.1383255270407412817250921e+00i),
203 }
204
205 type ff struct {
206 r, theta float64
207 }
208
209 var polar = []ff{
210 {9.2022120669932650313380972e+00, 9.9909115046919291062461269e-01},
211 {7.7438239742296106616261394e+00, -3.5762575021856971295156489e-02},
212 {5.0182478202557746902556648e+00, -1.6259990074019058442232221e+00},
213 {1.0861137372799545160704002e+01, 2.0502936359659111755031062e+00},
214 {1.0070841084922199607011905e+01, 2.9483213155446756211881774e-01},
215 {5.9922447613166942183705192e+00, 1.0605860367252556281902109e+00},
216 {5.8978784056736762299945176e+00, 4.8084556083358307819310911e-01},
217 {3.2822866700678709020367184e+00, 5.8969634164776659423195222e-01},
218 {8.8756430028990417290744307e+00, -1.3636647724582455028314573e+00},
219 {1.0011785496777731986390856e+01, 2.6210913895386013290915234e+00},
220 }
221 var pow = []complex128{
222 (-2.499956739197529585028819e+00 + 1.759751724335650228957144e+00i),
223 (7.357094338218116311191939e+04 - 5.089973412479151648145882e+04i),
224 (1.320777296067768517259592e+01 - 3.165621914333901498921986e+01i),
225 (-3.123287828297300934072149e-07 - 1.9849567521490553032502223e-7i),
226 (8.0622651468477229614813e+04 - 7.80028727944573092944363e+04i),
227 (-1.0268824572103165858577141e+00 - 4.716844738244989776610672e-01i),
228 (-4.35953819012244175753187e+01 + 2.2036445974645306917648585e+02i),
229 (8.3556092283250594950239e-01 - 1.2261571947167240272593282e+01i),
230 (1.582292972120769306069625e+03 + 1.273564263524278244782512e+04i),
231 (6.592208301642122149025369e-08 + 2.584887236651661903526389e-08i),
232 }
233 var sin = []complex128{
234 (-1.1073801774240233539648544e+03 + 3.024539773002502192425231e+02i),
235 (1.0317037521400759359744682e+00 - 3.2208979799929570242818e-02i),
236 (-2.0501952097271429804261058e+01 - 7.2137981348240798841800967e+01i),
237 (7.3173638080346338642193078e+03 + 2.249219506193664342566248e+03i),
238 (-1.964375633631808177565226e+00 - 9.0958264713870404464159683e+00i),
239 (1.992783647158514838337674e+01 - 9.11555769410191350416942e+01i),
240 (-6.680335650741921444300349e+00 + 3.763353833142432513086117e+00i),
241 (1.2794028166657459148245993e+00 - 2.7669092099795781155109602e+00i),
242 (2.8641693949535259594188879e+03 + 7.451234399649871202841615e+02i),
243 (-4.893811726244659135553033e+01 - 5.371469305562194635957655e+01i),
244 }
245 var sinh = []complex128{
246 (8.34559353341652565758198e+00 + 7.2187893208650790476628899e+01i),
247 (1.1042192548260646752051112e+03 - 3.1379650595631635858792056e+02i),
248 (-8.239469336509264113041849e-02 + 9.9273668758439489098514519e-01i),
249 (7.332295456982297798219401e+01 - 1.574585908122833444899023e+01i),
250 (-7.4786432301380582103534216e+03 + 1.63483823493980029604071e+03i),
251 (4.595842179016870234028347e+00 - 8.135290105518580753211484e+00i),
252 (-8.543842533574163435246793e+01 + 3.750798997857594068272375e+01i),
253 (-1.918003500809465688017307e+00 + 7.4358344619793504041350251e+00i),
254 (-2.233816733239658031433147e+00 - 2.143519070805995056229335e+00i),
255 (-7.797564130187551181105341e+02 - 2.8549352346594918614806877e+03i),
256 }
257 var sqrt = []complex128{
258 (2.6628203086086130543813948e+00 + 1.4531345674282185229796902e+00i),
259 (2.7823278427251986247149295e+00 - 4.9756907317005224529115567e-02i),
260 (1.5397025302089642757361015e+00 - 1.6271336573016637535695727e+00i),
261 (1.7103411581506875260277898e+00 + 2.8170677122737589676157029e+00i),
262 (3.1390392472953103383607947e+00 + 4.6612625849858653248980849e-01i),
263 (2.1117080764822417640789287e+00 + 1.2381170223514273234967850e+00i),
264 (2.3587032281672256703926939e+00 + 5.7827111903257349935720172e-01i),
265 (1.7335262588873410476661577e+00 + 5.2647258220721269141550382e-01i),
266 (2.3131094974708716531499282e+00 - 1.8775429304303785570775490e+00i),
267 (8.1420535745048086240947359e-01 + 3.0575897587277248522656113e+00i),
268 }
269 var tan = []complex128{
270 (-1.928757919086441129134525e-07 + 1.0000003267499169073251826e+00i),
271 (1.242412685364183792138948e+00 - 3.17149693883133370106696e+00i),
272 (-4.6745126251587795225571826e-05 - 9.9992439225263959286114298e-01i),
273 (4.792363401193648192887116e-09 + 1.0000000070589333451557723e+00i),
274 (2.345740824080089140287315e-03 + 9.947733046570988661022763e-01i),
275 (-2.396030789494815566088809e-05 + 9.9994781345418591429826779e-01i),
276 (-7.370204836644931340905303e-03 + 1.0043553413417138987717748e+00i),
277 (-3.691803847992048527007457e-02 + 9.6475071993469548066328894e-01i),
278 (-2.781955256713729368401878e-08 - 1.000000049848910609006646e+00i),
279 (9.4281590064030478879791249e-05 + 9.9999119340863718183758545e-01i),
280 }
281 var tanh = []complex128{
282 (1.0000921981225144748819918e+00 + 2.160986245871518020231507e-05i),
283 (9.9999967727531993209562591e-01 - 1.9953763222959658873657676e-07i),
284 (-1.765485739548037260789686e+00 + 1.7024216325552852445168471e+00i),
285 (-9.999189442732736452807108e-01 + 3.64906070494473701938098e-05i),
286 (9.9999999224622333738729767e-01 - 3.560088949517914774813046e-09i),
287 (1.0029324933367326862499343e+00 - 4.948790309797102353137528e-03i),
288 (9.9996113064788012488693567e-01 - 4.226995742097032481451259e-05i),
289 (1.0074784189316340029873945e+00 - 4.194050814891697808029407e-03i),
290 (9.9385534229718327109131502e-01 + 5.144217985914355502713437e-02i),
291 (-1.0000000491604982429364892e+00 - 2.901873195374433112227349e-08i),
292 }
293
294
295 var hugeIn = []complex128{
296 1 << 28,
297 1 << 29,
298 1 << 30,
299 1 << 35,
300 -1 << 120,
301 1 << 240,
302 1 << 300,
303 -1 << 480,
304 1234567891234567 << 180,
305 -1234567891234567 << 300,
306 }
307
308
309
310 var tanHuge = []complex128{
311 5.95641897939639421,
312 -0.34551069233430392,
313 -0.78469661331920043,
314 0.84276385870875983,
315 0.40806638884180424,
316 -0.37603456702698076,
317 4.60901287677810962,
318 3.39135965054779932,
319 -6.76813854009065030,
320 -0.76417695016604922,
321 }
322
323
324 var inf, nan = math.Inf(1), math.NaN()
325
326 var vcAbsSC = []complex128{
327 NaN(),
328 }
329 var absSC = []float64{
330 math.NaN(),
331 }
332 var acosSC = []struct {
333 in,
334 want complex128
335 }{
336
337 {complex(zero, zero),
338 complex(math.Pi/2, -zero)},
339 {complex(-zero, zero),
340 complex(math.Pi/2, -zero)},
341 {complex(zero, nan),
342 complex(math.Pi/2, nan)},
343 {complex(-zero, nan),
344 complex(math.Pi/2, nan)},
345 {complex(1.0, inf),
346 complex(math.Pi/2, -inf)},
347 {complex(1.0, nan),
348 NaN()},
349 {complex(-inf, 1.0),
350 complex(math.Pi, -inf)},
351 {complex(inf, 1.0),
352 complex(0.0, -inf)},
353 {complex(-inf, inf),
354 complex(3*math.Pi/4, -inf)},
355 {complex(inf, inf),
356 complex(math.Pi/4, -inf)},
357 {complex(inf, nan),
358 complex(nan, -inf)},
359 {complex(-inf, nan),
360 complex(nan, inf)},
361 {complex(nan, 1.0),
362 NaN()},
363 {complex(nan, inf),
364 complex(nan, -inf)},
365 {NaN(),
366 NaN()},
367 }
368 var acoshSC = []struct {
369 in,
370 want complex128
371 }{
372
373 {complex(zero, zero),
374 complex(zero, math.Pi/2)},
375 {complex(-zero, zero),
376 complex(zero, math.Pi/2)},
377 {complex(1.0, inf),
378 complex(inf, math.Pi/2)},
379 {complex(1.0, nan),
380 NaN()},
381 {complex(-inf, 1.0),
382 complex(inf, math.Pi)},
383 {complex(inf, 1.0),
384 complex(inf, zero)},
385 {complex(-inf, inf),
386 complex(inf, 3*math.Pi/4)},
387 {complex(inf, inf),
388 complex(inf, math.Pi/4)},
389 {complex(inf, nan),
390 complex(inf, nan)},
391 {complex(-inf, nan),
392 complex(inf, nan)},
393 {complex(nan, 1.0),
394 NaN()},
395 {complex(nan, inf),
396 complex(inf, nan)},
397 {NaN(),
398 NaN()},
399 }
400 var asinSC = []struct {
401 in,
402 want complex128
403 }{
404
405 {complex(zero, zero),
406 complex(zero, zero)},
407 {complex(1.0, inf),
408 complex(0, inf)},
409 {complex(1.0, nan),
410 NaN()},
411 {complex(inf, 1),
412 complex(math.Pi/2, inf)},
413 {complex(inf, inf),
414 complex(math.Pi/4, inf)},
415 {complex(inf, nan),
416 complex(nan, inf)},
417 {complex(nan, zero),
418 NaN()},
419 {complex(nan, 1),
420 NaN()},
421 {complex(nan, inf),
422 complex(nan, inf)},
423 {NaN(),
424 NaN()},
425 }
426 var asinhSC = []struct {
427 in,
428 want complex128
429 }{
430
431 {complex(zero, zero),
432 complex(zero, zero)},
433 {complex(1.0, inf),
434 complex(inf, math.Pi/2)},
435 {complex(1.0, nan),
436 NaN()},
437 {complex(inf, 1.0),
438 complex(inf, zero)},
439 {complex(inf, inf),
440 complex(inf, math.Pi/4)},
441 {complex(inf, nan),
442 complex(inf, nan)},
443 {complex(nan, zero),
444 complex(nan, zero)},
445 {complex(nan, 1.0),
446 NaN()},
447 {complex(nan, inf),
448 complex(inf, nan)},
449 {NaN(),
450 NaN()},
451 }
452 var atanSC = []struct {
453 in,
454 want complex128
455 }{
456
457 {complex(0, zero),
458 complex(0, zero)},
459 {complex(0, nan),
460 NaN()},
461 {complex(1.0, zero),
462 complex(math.Pi/4, zero)},
463 {complex(1.0, inf),
464 complex(math.Pi/2, zero)},
465 {complex(1.0, nan),
466 NaN()},
467 {complex(inf, 1),
468 complex(math.Pi/2, zero)},
469 {complex(inf, inf),
470 complex(math.Pi/2, zero)},
471 {complex(inf, nan),
472 complex(math.Pi/2, zero)},
473 {complex(nan, 1),
474 NaN()},
475 {complex(nan, inf),
476 complex(nan, zero)},
477 {NaN(),
478 NaN()},
479 }
480 var atanhSC = []struct {
481 in,
482 want complex128
483 }{
484
485 {complex(zero, zero),
486 complex(zero, zero)},
487 {complex(zero, nan),
488 complex(zero, nan)},
489 {complex(1.0, zero),
490 complex(inf, zero)},
491 {complex(1.0, inf),
492 complex(0, math.Pi/2)},
493 {complex(1.0, nan),
494 NaN()},
495 {complex(inf, 1.0),
496 complex(zero, math.Pi/2)},
497 {complex(inf, inf),
498 complex(zero, math.Pi/2)},
499 {complex(inf, nan),
500 complex(0, nan)},
501 {complex(nan, 1.0),
502 NaN()},
503 {complex(nan, inf),
504 complex(zero, math.Pi/2)},
505 {NaN(),
506 NaN()},
507 }
508 var vcConjSC = []complex128{
509 NaN(),
510 }
511 var conjSC = []complex128{
512 NaN(),
513 }
514 var cosSC = []struct {
515 in,
516 want complex128
517 }{
518
519 {complex(zero, zero),
520 complex(1.0, -zero)},
521 {complex(zero, inf),
522 complex(inf, -zero)},
523 {complex(zero, nan),
524 complex(nan, zero)},
525 {complex(1.0, inf),
526 complex(inf, -inf)},
527 {complex(1.0, nan),
528 NaN()},
529 {complex(inf, zero),
530 complex(nan, -zero)},
531 {complex(inf, 1.0),
532 NaN()},
533 {complex(inf, inf),
534 complex(inf, nan)},
535 {complex(inf, nan),
536 NaN()},
537 {complex(nan, zero),
538 complex(nan, -zero)},
539 {complex(nan, 1.0),
540 NaN()},
541 {complex(nan, inf),
542 complex(inf, nan)},
543 {NaN(),
544 NaN()},
545 }
546 var coshSC = []struct {
547 in,
548 want complex128
549 }{
550
551 {complex(zero, zero),
552 complex(1.0, zero)},
553 {complex(zero, inf),
554 complex(nan, zero)},
555 {complex(zero, nan),
556 complex(nan, zero)},
557 {complex(1.0, inf),
558 NaN()},
559 {complex(1.0, nan),
560 NaN()},
561 {complex(inf, zero),
562 complex(inf, zero)},
563 {complex(inf, 1.0),
564 complex(inf*math.Cos(1.0), inf*math.Sin(1.0))},
565 {complex(inf, inf),
566 complex(inf, nan)},
567 {complex(inf, nan),
568 complex(inf, nan)},
569 {complex(nan, zero),
570 complex(nan, zero)},
571 {complex(nan, 1.0),
572 NaN()},
573 {complex(nan, inf),
574 NaN()},
575 {NaN(),
576 NaN()},
577 }
578 var expSC = []struct {
579 in,
580 want complex128
581 }{
582
583 {complex(zero, zero),
584 complex(1.0, zero)},
585 {complex(-zero, zero),
586 complex(1.0, zero)},
587 {complex(1.0, inf),
588 NaN()},
589 {complex(1.0, nan),
590 NaN()},
591 {complex(inf, zero),
592 complex(inf, zero)},
593 {complex(-inf, 1.0),
594 complex(math.Copysign(0.0, math.Cos(1.0)), math.Copysign(0.0, math.Sin(1.0)))},
595 {complex(inf, 1.0),
596 complex(inf*math.Cos(1.0), inf*math.Sin(1.0))},
597 {complex(-inf, inf),
598 complex(zero, zero)},
599 {complex(inf, inf),
600 complex(inf, nan)},
601 {complex(-inf, nan),
602 complex(zero, zero)},
603 {complex(inf, nan),
604 complex(inf, nan)},
605 {complex(nan, zero),
606 complex(nan, zero)},
607 {complex(nan, 1.0),
608 NaN()},
609 {complex(nan, inf),
610 NaN()},
611 {NaN(),
612 NaN()},
613 }
614 var vcIsNaNSC = []complex128{
615 complex(math.Inf(-1), math.Inf(-1)),
616 complex(math.Inf(-1), math.NaN()),
617 complex(math.NaN(), math.Inf(-1)),
618 complex(0, math.NaN()),
619 complex(math.NaN(), 0),
620 complex(math.Inf(1), math.Inf(1)),
621 complex(math.Inf(1), math.NaN()),
622 complex(math.NaN(), math.Inf(1)),
623 complex(math.NaN(), math.NaN()),
624 }
625 var isNaNSC = []bool{
626 false,
627 false,
628 false,
629 true,
630 true,
631 false,
632 false,
633 false,
634 true,
635 }
636
637 var logSC = []struct {
638 in,
639 want complex128
640 }{
641
642 {complex(zero, zero),
643 complex(-inf, zero)},
644 {complex(-zero, zero),
645 complex(-inf, math.Pi)},
646 {complex(1.0, inf),
647 complex(inf, math.Pi/2)},
648 {complex(1.0, nan),
649 NaN()},
650 {complex(-inf, 1.0),
651 complex(inf, math.Pi)},
652 {complex(inf, 1.0),
653 complex(inf, 0.0)},
654 {complex(-inf, inf),
655 complex(inf, 3*math.Pi/4)},
656 {complex(inf, inf),
657 complex(inf, math.Pi/4)},
658 {complex(-inf, nan),
659 complex(inf, nan)},
660 {complex(inf, nan),
661 complex(inf, nan)},
662 {complex(nan, 1.0),
663 NaN()},
664 {complex(nan, inf),
665 complex(inf, nan)},
666 {NaN(),
667 NaN()},
668 }
669 var log10SC = []struct {
670 in,
671 want complex128
672 }{
673
674 {complex(zero, zero),
675 complex(-inf, zero)},
676 {complex(-zero, zero),
677 complex(-inf, float64(math.Log10E)*float64(math.Pi))},
678 {complex(1.0, inf),
679 complex(inf, float64(math.Log10E)*float64(math.Pi/2))},
680 {complex(1.0, nan),
681 NaN()},
682 {complex(-inf, 1.0),
683 complex(inf, float64(math.Log10E)*float64(math.Pi))},
684 {complex(inf, 1.0),
685 complex(inf, 0.0)},
686 {complex(-inf, inf),
687 complex(inf, float64(math.Log10E)*float64(3*math.Pi/4))},
688 {complex(inf, inf),
689 complex(inf, float64(math.Log10E)*float64(math.Pi/4))},
690 {complex(-inf, nan),
691 complex(inf, nan)},
692 {complex(inf, nan),
693 complex(inf, nan)},
694 {complex(nan, 1.0),
695 NaN()},
696 {complex(nan, inf),
697 complex(inf, nan)},
698 {NaN(),
699 NaN()},
700 }
701 var vcPolarSC = []complex128{
702 NaN(),
703 }
704 var polarSC = []ff{
705 {math.NaN(), math.NaN()},
706 }
707 var vcPowSC = [][2]complex128{
708 {NaN(), NaN()},
709 {0, NaN()},
710 }
711 var powSC = []complex128{
712 NaN(),
713 NaN(),
714 }
715 var sinSC = []struct {
716 in,
717 want complex128
718 }{
719
720 {complex(zero, zero),
721 complex(zero, zero)},
722 {complex(zero, inf),
723 complex(zero, inf)},
724 {complex(zero, nan),
725 complex(zero, nan)},
726 {complex(1.0, inf),
727 complex(inf, inf)},
728 {complex(1.0, nan),
729 NaN()},
730 {complex(inf, zero),
731 complex(nan, zero)},
732 {complex(inf, 1.0),
733 NaN()},
734 {complex(inf, inf),
735 complex(nan, inf)},
736 {complex(inf, nan),
737 NaN()},
738 {complex(nan, zero),
739 complex(nan, zero)},
740 {complex(nan, 1.0),
741 NaN()},
742 {complex(nan, inf),
743 complex(nan, inf)},
744 {NaN(),
745 NaN()},
746 }
747
748 var sinhSC = []struct {
749 in,
750 want complex128
751 }{
752
753 {complex(zero, zero),
754 complex(zero, zero)},
755 {complex(zero, inf),
756 complex(zero, nan)},
757 {complex(zero, nan),
758 complex(zero, nan)},
759 {complex(1.0, inf),
760 NaN()},
761 {complex(1.0, nan),
762 NaN()},
763 {complex(inf, zero),
764 complex(inf, zero)},
765 {complex(inf, 1.0),
766 complex(inf*math.Cos(1.0), inf*math.Sin(1.0))},
767 {complex(inf, inf),
768 complex(inf, nan)},
769 {complex(inf, nan),
770 complex(inf, nan)},
771 {complex(nan, zero),
772 complex(nan, zero)},
773 {complex(nan, 1.0),
774 NaN()},
775 {complex(nan, inf),
776 NaN()},
777 {NaN(),
778 NaN()},
779 }
780
781 var sqrtSC = []struct {
782 in,
783 want complex128
784 }{
785
786 {complex(zero, zero),
787 complex(zero, zero)},
788 {complex(-zero, zero),
789 complex(zero, zero)},
790 {complex(1.0, inf),
791 complex(inf, inf)},
792 {complex(nan, inf),
793 complex(inf, inf)},
794 {complex(1.0, nan),
795 NaN()},
796 {complex(-inf, 1.0),
797 complex(zero, inf)},
798 {complex(inf, 1.0),
799 complex(inf, zero)},
800 {complex(-inf, nan),
801 complex(nan, inf)},
802 {complex(inf, nan),
803 complex(inf, nan)},
804 {complex(nan, 1.0),
805 NaN()},
806 {NaN(),
807 NaN()},
808 }
809 var tanSC = []struct {
810 in,
811 want complex128
812 }{
813
814 {complex(zero, zero),
815 complex(zero, zero)},
816 {complex(zero, nan),
817 complex(zero, nan)},
818 {complex(1.0, inf),
819 complex(zero, 1.0)},
820 {complex(1.0, nan),
821 NaN()},
822 {complex(inf, 1.0),
823 NaN()},
824 {complex(inf, inf),
825 complex(zero, 1.0)},
826 {complex(inf, nan),
827 NaN()},
828 {complex(nan, zero),
829 NaN()},
830 {complex(nan, 1.0),
831 NaN()},
832 {complex(nan, inf),
833 complex(zero, 1.0)},
834 {NaN(),
835 NaN()},
836 }
837 var tanhSC = []struct {
838 in,
839 want complex128
840 }{
841
842 {complex(zero, zero),
843 complex(zero, zero)},
844 {complex(1.0, inf),
845 NaN()},
846 {complex(1.0, nan),
847 NaN()},
848 {complex(inf, 1.0),
849 complex(1.0, math.Copysign(0.0, math.Sin(2*1.0)))},
850 {complex(inf, inf),
851 complex(1.0, zero)},
852 {complex(inf, nan),
853 complex(1.0, zero)},
854 {complex(nan, zero),
855 complex(nan, zero)},
856 {complex(nan, 1.0),
857 NaN()},
858 {complex(nan, inf),
859 NaN()},
860 {NaN(),
861 NaN()},
862 }
863
864
865
866
867
868 var zero = 0.0
869 var eps = 1.0 / (1 << 53)
870
871 var branchPoints = [][2]complex128{
872 {complex(2.0, zero), complex(2.0, eps)},
873 {complex(2.0, -zero), complex(2.0, -eps)},
874 {complex(-2.0, zero), complex(-2.0, eps)},
875 {complex(-2.0, -zero), complex(-2.0, -eps)},
876 {complex(zero, 2.0), complex(eps, 2.0)},
877 {complex(-zero, 2.0), complex(-eps, 2.0)},
878 {complex(zero, -2.0), complex(eps, -2.0)},
879 {complex(-zero, -2.0), complex(-eps, -2.0)},
880 }
881
882
883 func tolerance(a, b, e float64) bool {
884 d := a - b
885 if d < 0 {
886 d = -d
887 }
888
889
890
891 if b != 0 {
892 e = e * b
893 if e < 0 {
894 e = -e
895 }
896 }
897 return d < e
898 }
899 func veryclose(a, b float64) bool { return tolerance(a, b, 4e-16) }
900 func alike(a, b float64) bool {
901 switch {
902 case a != a && b != b:
903 return true
904 case a == b:
905 return math.Signbit(a) == math.Signbit(b)
906 }
907 return false
908 }
909
910 func cTolerance(a, b complex128, e float64) bool {
911 d := Abs(a - b)
912 if b != 0 {
913 e = e * Abs(b)
914 if e < 0 {
915 e = -e
916 }
917 }
918 return d < e
919 }
920 func cSoclose(a, b complex128, e float64) bool { return cTolerance(a, b, e) }
921 func cVeryclose(a, b complex128) bool { return cTolerance(a, b, 4e-16) }
922 func cAlike(a, b complex128) bool {
923 var realAlike, imagAlike bool
924 if isExact(real(b)) {
925 realAlike = alike(real(a), real(b))
926 } else {
927
928 realAlike = veryclose(real(a), real(b))
929 }
930 if isExact(imag(b)) {
931 imagAlike = alike(imag(a), imag(b))
932 } else {
933
934 imagAlike = veryclose(imag(a), imag(b))
935 }
936 return realAlike && imagAlike
937 }
938 func isExact(x float64) bool {
939
940
941 return math.IsNaN(x) || math.IsInf(x, 0) || x == 0 || x == 1 || x == -1
942 }
943
944 func TestAbs(t *testing.T) {
945 for i := 0; i < len(vc); i++ {
946 if f := Abs(vc[i]); !veryclose(abs[i], f) {
947 t.Errorf("Abs(%g) = %g, want %g", vc[i], f, abs[i])
948 }
949 }
950 for i := 0; i < len(vcAbsSC); i++ {
951 if f := Abs(vcAbsSC[i]); !alike(absSC[i], f) {
952 t.Errorf("Abs(%g) = %g, want %g", vcAbsSC[i], f, absSC[i])
953 }
954 }
955 }
956 func TestAcos(t *testing.T) {
957 for i := 0; i < len(vc); i++ {
958 if f := Acos(vc[i]); !cSoclose(acos[i], f, 1e-14) {
959 t.Errorf("Acos(%g) = %g, want %g", vc[i], f, acos[i])
960 }
961 }
962 for _, v := range acosSC {
963 if f := Acos(v.in); !cAlike(v.want, f) {
964 t.Errorf("Acos(%g) = %g, want %g", v.in, f, v.want)
965 }
966 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
967
968 continue
969 }
970
971 if f := Acos(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
972 t.Errorf("Acos(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
973 }
974 }
975 for _, pt := range branchPoints {
976 if f0, f1 := Acos(pt[0]), Acos(pt[1]); !cVeryclose(f0, f1) {
977 t.Errorf("Acos(%g) not continuous, got %g want %g", pt[0], f0, f1)
978 }
979 }
980 }
981 func TestAcosh(t *testing.T) {
982 for i := 0; i < len(vc); i++ {
983 if f := Acosh(vc[i]); !cSoclose(acosh[i], f, 1e-14) {
984 t.Errorf("Acosh(%g) = %g, want %g", vc[i], f, acosh[i])
985 }
986 }
987 for _, v := range acoshSC {
988 if f := Acosh(v.in); !cAlike(v.want, f) {
989 t.Errorf("Acosh(%g) = %g, want %g", v.in, f, v.want)
990 }
991 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
992
993 continue
994 }
995
996 if f := Acosh(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
997 t.Errorf("Acosh(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
998 }
999
1000 }
1001 for _, pt := range branchPoints {
1002 if f0, f1 := Acosh(pt[0]), Acosh(pt[1]); !cVeryclose(f0, f1) {
1003 t.Errorf("Acosh(%g) not continuous, got %g want %g", pt[0], f0, f1)
1004 }
1005 }
1006 }
1007 func TestAsin(t *testing.T) {
1008 for i := 0; i < len(vc); i++ {
1009 if f := Asin(vc[i]); !cSoclose(asin[i], f, 1e-14) {
1010 t.Errorf("Asin(%g) = %g, want %g", vc[i], f, asin[i])
1011 }
1012 }
1013 for _, v := range asinSC {
1014 if f := Asin(v.in); !cAlike(v.want, f) {
1015 t.Errorf("Asin(%g) = %g, want %g", v.in, f, v.want)
1016 }
1017 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
1018
1019 continue
1020 }
1021
1022 if f := Asin(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
1023 t.Errorf("Asin(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
1024 }
1025 if math.IsNaN(real(v.in)) || math.IsNaN(real(v.want)) {
1026
1027 continue
1028 }
1029
1030 if f := Asin(-v.in); !cAlike(-v.want, f) && !cAlike(v.in, -v.in) {
1031 t.Errorf("Asin(%g) = %g, want %g", -v.in, f, -v.want)
1032 }
1033 }
1034 for _, pt := range branchPoints {
1035 if f0, f1 := Asin(pt[0]), Asin(pt[1]); !cVeryclose(f0, f1) {
1036 t.Errorf("Asin(%g) not continuous, got %g want %g", pt[0], f0, f1)
1037 }
1038 }
1039 }
1040 func TestAsinh(t *testing.T) {
1041 for i := 0; i < len(vc); i++ {
1042 if f := Asinh(vc[i]); !cSoclose(asinh[i], f, 4e-15) {
1043 t.Errorf("Asinh(%g) = %g, want %g", vc[i], f, asinh[i])
1044 }
1045 }
1046 for _, v := range asinhSC {
1047 if f := Asinh(v.in); !cAlike(v.want, f) {
1048 t.Errorf("Asinh(%g) = %g, want %g", v.in, f, v.want)
1049 }
1050 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
1051
1052 continue
1053 }
1054
1055 if f := Asinh(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
1056 t.Errorf("Asinh(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
1057 }
1058 if math.IsNaN(real(v.in)) || math.IsNaN(real(v.want)) {
1059
1060 continue
1061 }
1062
1063 if f := Asinh(-v.in); !cAlike(-v.want, f) && !cAlike(v.in, -v.in) {
1064 t.Errorf("Asinh(%g) = %g, want %g", -v.in, f, -v.want)
1065 }
1066 }
1067 for _, pt := range branchPoints {
1068 if f0, f1 := Asinh(pt[0]), Asinh(pt[1]); !cVeryclose(f0, f1) {
1069 t.Errorf("Asinh(%g) not continuous, got %g want %g", pt[0], f0, f1)
1070 }
1071 }
1072 }
1073 func TestAtan(t *testing.T) {
1074 for i := 0; i < len(vc); i++ {
1075 if f := Atan(vc[i]); !cVeryclose(atan[i], f) {
1076 t.Errorf("Atan(%g) = %g, want %g", vc[i], f, atan[i])
1077 }
1078 }
1079 for _, v := range atanSC {
1080 if f := Atan(v.in); !cAlike(v.want, f) {
1081 t.Errorf("Atan(%g) = %g, want %g", v.in, f, v.want)
1082 }
1083 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
1084
1085 continue
1086 }
1087
1088 if f := Atan(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
1089 t.Errorf("Atan(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
1090 }
1091 if math.IsNaN(real(v.in)) || math.IsNaN(real(v.want)) {
1092
1093 continue
1094 }
1095
1096 if f := Atan(-v.in); !cAlike(-v.want, f) && !cAlike(v.in, -v.in) {
1097 t.Errorf("Atan(%g) = %g, want %g", -v.in, f, -v.want)
1098 }
1099 }
1100 for _, pt := range branchPoints {
1101 if f0, f1 := Atan(pt[0]), Atan(pt[1]); !cVeryclose(f0, f1) {
1102 t.Errorf("Atan(%g) not continuous, got %g want %g", pt[0], f0, f1)
1103 }
1104 }
1105 }
1106 func TestAtanh(t *testing.T) {
1107 for i := 0; i < len(vc); i++ {
1108 if f := Atanh(vc[i]); !cVeryclose(atanh[i], f) {
1109 t.Errorf("Atanh(%g) = %g, want %g", vc[i], f, atanh[i])
1110 }
1111 }
1112 for _, v := range atanhSC {
1113 if f := Atanh(v.in); !cAlike(v.want, f) {
1114 t.Errorf("Atanh(%g) = %g, want %g", v.in, f, v.want)
1115 }
1116 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
1117
1118 continue
1119 }
1120
1121 if f := Atanh(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
1122 t.Errorf("Atanh(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
1123 }
1124 if math.IsNaN(real(v.in)) || math.IsNaN(real(v.want)) {
1125
1126 continue
1127 }
1128
1129 if f := Atanh(-v.in); !cAlike(-v.want, f) && !cAlike(v.in, -v.in) {
1130 t.Errorf("Atanh(%g) = %g, want %g", -v.in, f, -v.want)
1131 }
1132 }
1133 for _, pt := range branchPoints {
1134 if f0, f1 := Atanh(pt[0]), Atanh(pt[1]); !cVeryclose(f0, f1) {
1135 t.Errorf("Atanh(%g) not continuous, got %g want %g", pt[0], f0, f1)
1136 }
1137 }
1138 }
1139 func TestConj(t *testing.T) {
1140 for i := 0; i < len(vc); i++ {
1141 if f := Conj(vc[i]); !cVeryclose(conj[i], f) {
1142 t.Errorf("Conj(%g) = %g, want %g", vc[i], f, conj[i])
1143 }
1144 }
1145 for i := 0; i < len(vcConjSC); i++ {
1146 if f := Conj(vcConjSC[i]); !cAlike(conjSC[i], f) {
1147 t.Errorf("Conj(%g) = %g, want %g", vcConjSC[i], f, conjSC[i])
1148 }
1149 }
1150 }
1151 func TestCos(t *testing.T) {
1152 for i := 0; i < len(vc); i++ {
1153 if f := Cos(vc[i]); !cSoclose(cos[i], f, 3e-15) {
1154 t.Errorf("Cos(%g) = %g, want %g", vc[i], f, cos[i])
1155 }
1156 }
1157 for _, v := range cosSC {
1158 if f := Cos(v.in); !cAlike(v.want, f) {
1159 t.Errorf("Cos(%g) = %g, want %g", v.in, f, v.want)
1160 }
1161 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
1162
1163 continue
1164 }
1165
1166 if f := Cos(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
1167 t.Errorf("Cos(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
1168 }
1169 if math.IsNaN(real(v.in)) || math.IsNaN(real(v.want)) {
1170
1171 continue
1172 }
1173
1174 if f := Cos(-v.in); !cAlike(v.want, f) && !cAlike(v.in, -v.in) {
1175 t.Errorf("Cos(%g) = %g, want %g", -v.in, f, v.want)
1176 }
1177 }
1178 }
1179 func TestCosh(t *testing.T) {
1180 for i := 0; i < len(vc); i++ {
1181 if f := Cosh(vc[i]); !cSoclose(cosh[i], f, 2e-15) {
1182 t.Errorf("Cosh(%g) = %g, want %g", vc[i], f, cosh[i])
1183 }
1184 }
1185 for _, v := range coshSC {
1186 if f := Cosh(v.in); !cAlike(v.want, f) {
1187 t.Errorf("Cosh(%g) = %g, want %g", v.in, f, v.want)
1188 }
1189 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
1190
1191 continue
1192 }
1193
1194 if f := Cosh(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
1195 t.Errorf("Cosh(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
1196 }
1197 if math.IsNaN(real(v.in)) || math.IsNaN(real(v.want)) {
1198
1199 continue
1200 }
1201
1202 if f := Cosh(-v.in); !cAlike(v.want, f) && !cAlike(v.in, -v.in) {
1203 t.Errorf("Cosh(%g) = %g, want %g", -v.in, f, v.want)
1204 }
1205 }
1206 }
1207 func TestExp(t *testing.T) {
1208 for i := 0; i < len(vc); i++ {
1209 if f := Exp(vc[i]); !cSoclose(exp[i], f, 1e-15) {
1210 t.Errorf("Exp(%g) = %g, want %g", vc[i], f, exp[i])
1211 }
1212 }
1213 for _, v := range expSC {
1214 if f := Exp(v.in); !cAlike(v.want, f) {
1215 t.Errorf("Exp(%g) = %g, want %g", v.in, f, v.want)
1216 }
1217 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
1218
1219 continue
1220 }
1221
1222 if f := Exp(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
1223 t.Errorf("Exp(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
1224 }
1225 }
1226 }
1227 func TestIsNaN(t *testing.T) {
1228 for i := 0; i < len(vcIsNaNSC); i++ {
1229 if f := IsNaN(vcIsNaNSC[i]); isNaNSC[i] != f {
1230 t.Errorf("IsNaN(%v) = %v, want %v", vcIsNaNSC[i], f, isNaNSC[i])
1231 }
1232 }
1233 }
1234 func TestLog(t *testing.T) {
1235 for i := 0; i < len(vc); i++ {
1236 if f := Log(vc[i]); !cVeryclose(log[i], f) {
1237 t.Errorf("Log(%g) = %g, want %g", vc[i], f, log[i])
1238 }
1239 }
1240 for _, v := range logSC {
1241 if f := Log(v.in); !cAlike(v.want, f) {
1242 t.Errorf("Log(%g) = %g, want %g", v.in, f, v.want)
1243 }
1244 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
1245
1246 continue
1247 }
1248
1249 if f := Log(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
1250 t.Errorf("Log(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
1251 }
1252 }
1253 for _, pt := range branchPoints {
1254 if f0, f1 := Log(pt[0]), Log(pt[1]); !cVeryclose(f0, f1) {
1255 t.Errorf("Log(%g) not continuous, got %g want %g", pt[0], f0, f1)
1256 }
1257 }
1258 }
1259 func TestLog10(t *testing.T) {
1260 for i := 0; i < len(vc); i++ {
1261 if f := Log10(vc[i]); !cVeryclose(log10[i], f) {
1262 t.Errorf("Log10(%g) = %g, want %g", vc[i], f, log10[i])
1263 }
1264 }
1265 for _, v := range log10SC {
1266 if f := Log10(v.in); !cAlike(v.want, f) {
1267 t.Errorf("Log10(%g) = %g, want %g", v.in, f, v.want)
1268 }
1269 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
1270
1271 continue
1272 }
1273
1274 if f := Log10(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
1275 t.Errorf("Log10(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
1276 }
1277 }
1278 }
1279 func TestPolar(t *testing.T) {
1280 for i := 0; i < len(vc); i++ {
1281 if r, theta := Polar(vc[i]); !veryclose(polar[i].r, r) && !veryclose(polar[i].theta, theta) {
1282 t.Errorf("Polar(%g) = %g, %g want %g, %g", vc[i], r, theta, polar[i].r, polar[i].theta)
1283 }
1284 }
1285 for i := 0; i < len(vcPolarSC); i++ {
1286 if r, theta := Polar(vcPolarSC[i]); !alike(polarSC[i].r, r) && !alike(polarSC[i].theta, theta) {
1287 t.Errorf("Polar(%g) = %g, %g, want %g, %g", vcPolarSC[i], r, theta, polarSC[i].r, polarSC[i].theta)
1288 }
1289 }
1290 }
1291 func TestPow(t *testing.T) {
1292
1293 var zero = complex(0, 0)
1294 zeroPowers := [][2]complex128{
1295 {0, 1 + 0i},
1296 {1.5, 0 + 0i},
1297 {-1.5, complex(math.Inf(0), 0)},
1298 {-1.5 + 1.5i, Inf()},
1299 }
1300 for _, zp := range zeroPowers {
1301 if f := Pow(zero, zp[0]); f != zp[1] {
1302 t.Errorf("Pow(%g, %g) = %g, want %g", zero, zp[0], f, zp[1])
1303 }
1304 }
1305 var a = complex(3.0, 3.0)
1306 for i := 0; i < len(vc); i++ {
1307 if f := Pow(a, vc[i]); !cSoclose(pow[i], f, 4e-15) {
1308 t.Errorf("Pow(%g, %g) = %g, want %g", a, vc[i], f, pow[i])
1309 }
1310 }
1311 for i := 0; i < len(vcPowSC); i++ {
1312 if f := Pow(vcPowSC[i][0], vcPowSC[i][1]); !cAlike(powSC[i], f) {
1313 t.Errorf("Pow(%g, %g) = %g, want %g", vcPowSC[i][0], vcPowSC[i][1], f, powSC[i])
1314 }
1315 }
1316 for _, pt := range branchPoints {
1317 if f0, f1 := Pow(pt[0], 0.1), Pow(pt[1], 0.1); !cVeryclose(f0, f1) {
1318 t.Errorf("Pow(%g, 0.1) not continuous, got %g want %g", pt[0], f0, f1)
1319 }
1320 }
1321 }
1322 func TestRect(t *testing.T) {
1323 for i := 0; i < len(vc); i++ {
1324 if f := Rect(polar[i].r, polar[i].theta); !cVeryclose(vc[i], f) {
1325 t.Errorf("Rect(%g, %g) = %g want %g", polar[i].r, polar[i].theta, f, vc[i])
1326 }
1327 }
1328 for i := 0; i < len(vcPolarSC); i++ {
1329 if f := Rect(polarSC[i].r, polarSC[i].theta); !cAlike(vcPolarSC[i], f) {
1330 t.Errorf("Rect(%g, %g) = %g, want %g", polarSC[i].r, polarSC[i].theta, f, vcPolarSC[i])
1331 }
1332 }
1333 }
1334 func TestSin(t *testing.T) {
1335 for i := 0; i < len(vc); i++ {
1336 if f := Sin(vc[i]); !cSoclose(sin[i], f, 2e-15) {
1337 t.Errorf("Sin(%g) = %g, want %g", vc[i], f, sin[i])
1338 }
1339 }
1340 for _, v := range sinSC {
1341 if f := Sin(v.in); !cAlike(v.want, f) {
1342 t.Errorf("Sin(%g) = %g, want %g", v.in, f, v.want)
1343 }
1344 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
1345
1346 continue
1347 }
1348
1349 if f := Sin(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
1350 t.Errorf("Sinh(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
1351 }
1352 if math.IsNaN(real(v.in)) || math.IsNaN(real(v.want)) {
1353
1354 continue
1355 }
1356
1357 if f := Sin(-v.in); !cAlike(-v.want, f) && !cAlike(v.in, -v.in) {
1358 t.Errorf("Sinh(%g) = %g, want %g", -v.in, f, -v.want)
1359 }
1360 }
1361 }
1362 func TestSinh(t *testing.T) {
1363 for i := 0; i < len(vc); i++ {
1364 if f := Sinh(vc[i]); !cSoclose(sinh[i], f, 2e-15) {
1365 t.Errorf("Sinh(%g) = %g, want %g", vc[i], f, sinh[i])
1366 }
1367 }
1368 for _, v := range sinhSC {
1369 if f := Sinh(v.in); !cAlike(v.want, f) {
1370 t.Errorf("Sinh(%g) = %g, want %g", v.in, f, v.want)
1371 }
1372 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
1373
1374 continue
1375 }
1376
1377 if f := Sinh(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
1378 t.Errorf("Sinh(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
1379 }
1380 if math.IsNaN(real(v.in)) || math.IsNaN(real(v.want)) {
1381
1382 continue
1383 }
1384
1385 if f := Sinh(-v.in); !cAlike(-v.want, f) && !cAlike(v.in, -v.in) {
1386 t.Errorf("Sinh(%g) = %g, want %g", -v.in, f, -v.want)
1387 }
1388 }
1389 }
1390 func TestSqrt(t *testing.T) {
1391 for i := 0; i < len(vc); i++ {
1392 if f := Sqrt(vc[i]); !cVeryclose(sqrt[i], f) {
1393 t.Errorf("Sqrt(%g) = %g, want %g", vc[i], f, sqrt[i])
1394 }
1395 }
1396 for _, v := range sqrtSC {
1397 if f := Sqrt(v.in); !cAlike(v.want, f) {
1398 t.Errorf("Sqrt(%g) = %g, want %g", v.in, f, v.want)
1399 }
1400 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
1401
1402 continue
1403 }
1404
1405 if f := Sqrt(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
1406 t.Errorf("Sqrt(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
1407 }
1408 }
1409 for _, pt := range branchPoints {
1410 if f0, f1 := Sqrt(pt[0]), Sqrt(pt[1]); !cVeryclose(f0, f1) {
1411 t.Errorf("Sqrt(%g) not continuous, got %g want %g", pt[0], f0, f1)
1412 }
1413 }
1414 }
1415 func TestTan(t *testing.T) {
1416 for i := 0; i < len(vc); i++ {
1417 if f := Tan(vc[i]); !cSoclose(tan[i], f, 3e-15) {
1418 t.Errorf("Tan(%g) = %g, want %g", vc[i], f, tan[i])
1419 }
1420 }
1421 for _, v := range tanSC {
1422 if f := Tan(v.in); !cAlike(v.want, f) {
1423 t.Errorf("Tan(%g) = %g, want %g", v.in, f, v.want)
1424 }
1425 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
1426
1427 continue
1428 }
1429
1430 if f := Tan(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
1431 t.Errorf("Tan(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
1432 }
1433 if math.IsNaN(real(v.in)) || math.IsNaN(real(v.want)) {
1434
1435 continue
1436 }
1437
1438 if f := Tan(-v.in); !cAlike(-v.want, f) && !cAlike(v.in, -v.in) {
1439 t.Errorf("Tan(%g) = %g, want %g", -v.in, f, -v.want)
1440 }
1441 }
1442 }
1443 func TestTanh(t *testing.T) {
1444 for i := 0; i < len(vc); i++ {
1445 if f := Tanh(vc[i]); !cSoclose(tanh[i], f, 2e-15) {
1446 t.Errorf("Tanh(%g) = %g, want %g", vc[i], f, tanh[i])
1447 }
1448 }
1449 for _, v := range tanhSC {
1450 if f := Tanh(v.in); !cAlike(v.want, f) {
1451 t.Errorf("Tanh(%g) = %g, want %g", v.in, f, v.want)
1452 }
1453 if math.IsNaN(imag(v.in)) || math.IsNaN(imag(v.want)) {
1454
1455 continue
1456 }
1457
1458 if f := Tanh(Conj(v.in)); !cAlike(Conj(v.want), f) && !cAlike(v.in, Conj(v.in)) {
1459 t.Errorf("Tanh(%g) = %g, want %g", Conj(v.in), f, Conj(v.want))
1460 }
1461 if math.IsNaN(real(v.in)) || math.IsNaN(real(v.want)) {
1462
1463 continue
1464 }
1465
1466 if f := Tanh(-v.in); !cAlike(-v.want, f) && !cAlike(v.in, -v.in) {
1467 t.Errorf("Tanh(%g) = %g, want %g", -v.in, f, -v.want)
1468 }
1469 }
1470 }
1471
1472
1473 func TestInfiniteLoopIntanSeries(t *testing.T) {
1474 want := Inf()
1475 if got := Cot(0); got != want {
1476 t.Errorf("Cot(0): got %g, want %g", got, want)
1477 }
1478 }
1479
1480 func BenchmarkAbs(b *testing.B) {
1481 for i := 0; i < b.N; i++ {
1482 Abs(complex(2.5, 3.5))
1483 }
1484 }
1485 func BenchmarkAcos(b *testing.B) {
1486 for i := 0; i < b.N; i++ {
1487 Acos(complex(2.5, 3.5))
1488 }
1489 }
1490 func BenchmarkAcosh(b *testing.B) {
1491 for i := 0; i < b.N; i++ {
1492 Acosh(complex(2.5, 3.5))
1493 }
1494 }
1495 func BenchmarkAsin(b *testing.B) {
1496 for i := 0; i < b.N; i++ {
1497 Asin(complex(2.5, 3.5))
1498 }
1499 }
1500 func BenchmarkAsinh(b *testing.B) {
1501 for i := 0; i < b.N; i++ {
1502 Asinh(complex(2.5, 3.5))
1503 }
1504 }
1505 func BenchmarkAtan(b *testing.B) {
1506 for i := 0; i < b.N; i++ {
1507 Atan(complex(2.5, 3.5))
1508 }
1509 }
1510 func BenchmarkAtanh(b *testing.B) {
1511 for i := 0; i < b.N; i++ {
1512 Atanh(complex(2.5, 3.5))
1513 }
1514 }
1515 func BenchmarkConj(b *testing.B) {
1516 for i := 0; i < b.N; i++ {
1517 Conj(complex(2.5, 3.5))
1518 }
1519 }
1520 func BenchmarkCos(b *testing.B) {
1521 for i := 0; i < b.N; i++ {
1522 Cos(complex(2.5, 3.5))
1523 }
1524 }
1525 func BenchmarkCosh(b *testing.B) {
1526 for i := 0; i < b.N; i++ {
1527 Cosh(complex(2.5, 3.5))
1528 }
1529 }
1530 func BenchmarkExp(b *testing.B) {
1531 for i := 0; i < b.N; i++ {
1532 Exp(complex(2.5, 3.5))
1533 }
1534 }
1535 func BenchmarkLog(b *testing.B) {
1536 for i := 0; i < b.N; i++ {
1537 Log(complex(2.5, 3.5))
1538 }
1539 }
1540 func BenchmarkLog10(b *testing.B) {
1541 for i := 0; i < b.N; i++ {
1542 Log10(complex(2.5, 3.5))
1543 }
1544 }
1545 func BenchmarkPhase(b *testing.B) {
1546 for i := 0; i < b.N; i++ {
1547 Phase(complex(2.5, 3.5))
1548 }
1549 }
1550 func BenchmarkPolar(b *testing.B) {
1551 for i := 0; i < b.N; i++ {
1552 Polar(complex(2.5, 3.5))
1553 }
1554 }
1555 func BenchmarkPow(b *testing.B) {
1556 for i := 0; i < b.N; i++ {
1557 Pow(complex(2.5, 3.5), complex(2.5, 3.5))
1558 }
1559 }
1560 func BenchmarkRect(b *testing.B) {
1561 for i := 0; i < b.N; i++ {
1562 Rect(2.5, 1.5)
1563 }
1564 }
1565 func BenchmarkSin(b *testing.B) {
1566 for i := 0; i < b.N; i++ {
1567 Sin(complex(2.5, 3.5))
1568 }
1569 }
1570 func BenchmarkSinh(b *testing.B) {
1571 for i := 0; i < b.N; i++ {
1572 Sinh(complex(2.5, 3.5))
1573 }
1574 }
1575 func BenchmarkSqrt(b *testing.B) {
1576 for i := 0; i < b.N; i++ {
1577 Sqrt(complex(2.5, 3.5))
1578 }
1579 }
1580 func BenchmarkTan(b *testing.B) {
1581 for i := 0; i < b.N; i++ {
1582 Tan(complex(2.5, 3.5))
1583 }
1584 }
1585 func BenchmarkTanh(b *testing.B) {
1586 for i := 0; i < b.N; i++ {
1587 Tanh(complex(2.5, 3.5))
1588 }
1589 }
1590
View as plain text