Source file src/math/cmplx/cmath_test.go

     1  // Copyright 2010 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  package cmplx
     6  
     7  import (
     8  	"math"
     9  	"testing"
    10  )
    11  
    12  // The higher-precision values in vc26 were used to derive the
    13  // input arguments vc (see also comment below). For reference
    14  // only (do not delete).
    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  // The expected results below were computed by the high precision calculators
    42  // at https://keisan.casio.com/.  More exact input values (array vc[], above)
    43  // were obtained by printing them with "%.26f".  The answers were calculated
    44  // to 26 digits (by using the "Digit number" drop-down control of each
    45  // calculator).
    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  // huge values along the real axis for testing reducePi in Tan
   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  // Results for tanHuge[i] calculated with https://github.com/robpike/ivy
   309  // using 4096 bits of working precision.
   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  // special cases conform to C99 standard appendix G.6 Complex arithmetic
   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  	// G.6.1.1
   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)}, // imaginary sign unspecified
   359  	{complex(-inf, nan),
   360  		complex(nan, inf)}, // imaginary sign unspecified
   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  	// G.6.2.1
   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  	// Derived from Asin(z) = -i * Asinh(i * z), G.6 #7
   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)}, // imaginary sign unspecified
   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  	// G.6.2.2
   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)}, // sign of real part unspecified
   449  	{NaN(),
   450  		NaN()},
   451  }
   452  var atanSC = []struct {
   453  	in,
   454  	want complex128
   455  }{
   456  	// Derived from Atan(z) = -i * Atanh(i * z), G.6 #7
   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  	// G.6.2.3
   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)}, // sign of real part not specified.
   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  	// Derived from Cos(z) = Cosh(i * z), G.6 #7
   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)}, // imaginary sign unspecified
   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)}, // real sign unspecified
   535  	{complex(inf, nan),
   536  		NaN()},
   537  	{complex(nan, zero),
   538  		complex(nan, -zero)}, // imaginary sign unspecified
   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  	// G.6.2.4
   551  	{complex(zero, zero),
   552  		complex(1.0, zero)},
   553  	{complex(zero, inf),
   554  		complex(nan, zero)}, // imaginary sign unspecified
   555  	{complex(zero, nan),
   556  		complex(nan, zero)}, // imaginary sign unspecified
   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))}, // +inf  cis(y)
   565  	{complex(inf, inf),
   566  		complex(inf, nan)}, // real sign unspecified
   567  	{complex(inf, nan),
   568  		complex(inf, nan)},
   569  	{complex(nan, zero),
   570  		complex(nan, zero)}, // imaginary sign unspecified
   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  	// G.6.3.1
   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)))}, // +0 cis(y)
   595  	{complex(inf, 1.0),
   596  		complex(inf*math.Cos(1.0), inf*math.Sin(1.0))}, // +inf  cis(y)
   597  	{complex(-inf, inf),
   598  		complex(zero, zero)}, // real and imaginary sign unspecified
   599  	{complex(inf, inf),
   600  		complex(inf, nan)}, // real sign unspecified
   601  	{complex(-inf, nan),
   602  		complex(zero, zero)}, // real and imaginary sign unspecified
   603  	{complex(inf, nan),
   604  		complex(inf, nan)}, // real sign unspecified
   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  	// G.6.3.2
   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  	// derived from Log special cases via Log10(x) = math.Log10E*Log(x)
   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  	// Derived from Sin(z) = -i * Sinh(i * z), G.6 #7
   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  	// G.6.2.5
   753  	{complex(zero, zero),
   754  		complex(zero, zero)},
   755  	{complex(zero, inf),
   756  		complex(zero, nan)}, // real sign unspecified
   757  	{complex(zero, nan),
   758  		complex(zero, nan)}, // real sign unspecified
   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))}, // +inf  cis(y)
   767  	{complex(inf, inf),
   768  		complex(inf, nan)}, // real sign unspecified
   769  	{complex(inf, nan),
   770  		complex(inf, nan)}, // real sign unspecified
   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  	// G.6.4.2
   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)}, // imaginary sign unspecified
   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  	// Derived from Tan(z) = -i * Tanh(i * z), G.6 #7
   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  	// G.6.2.6
   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)))}, // 1 + i 0 sin(2y)
   850  	{complex(inf, inf),
   851  		complex(1.0, zero)}, // imaginary sign unspecified
   852  	{complex(inf, nan),
   853  		complex(1.0, zero)}, // imaginary sign unspecified
   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  // branch cut continuity checks
   865  // points on each axis at |z| > 1 are checked for one-sided continuity from both the positive and negative side
   866  // all possible branch cuts for the elementary functions are at one of these points
   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  // functions borrowed from pkg/math/all_test.go
   883  func tolerance(a, b, e float64) bool {
   884  	d := a - b
   885  	if d < 0 {
   886  		d = -d
   887  	}
   888  
   889  	// note: b is correct (expected) value, a is actual value.
   890  	// make error tolerance a fraction of b, not a.
   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: // math.IsNaN(a) && math.IsNaN(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  		// Allow non-exact special cases to have errors in ULP.
   928  		realAlike = veryclose(real(a), real(b))
   929  	}
   930  	if isExact(imag(b)) {
   931  		imagAlike = alike(imag(a), imag(b))
   932  	} else {
   933  		// Allow non-exact special cases to have errors in ULP.
   934  		imagAlike = veryclose(imag(a), imag(b))
   935  	}
   936  	return realAlike && imagAlike
   937  }
   938  func isExact(x float64) bool {
   939  	// Special cases that should match exactly.  Other cases are multiples
   940  	// of Pi that may not be last bit identical on all platforms.
   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  			// Negating NaN is undefined with regard to the sign bit produced.
   968  			continue
   969  		}
   970  		// Acos(Conj(z))  == Conj(Acos(z))
   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  			// Negating NaN is undefined with regard to the sign bit produced.
   993  			continue
   994  		}
   995  		// Acosh(Conj(z))  == Conj(Acosh(z))
   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  			// Negating NaN is undefined with regard to the sign bit produced.
  1019  			continue
  1020  		}
  1021  		// Asin(Conj(z))  == Asin(Sinh(z))
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1027  			continue
  1028  		}
  1029  		// Asin(-z)  == -Asin(z)
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1052  			continue
  1053  		}
  1054  		// Asinh(Conj(z))  == Asinh(Sinh(z))
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1060  			continue
  1061  		}
  1062  		// Asinh(-z)  == -Asinh(z)
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1085  			continue
  1086  		}
  1087  		// Atan(Conj(z))  == Conj(Atan(z))
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1093  			continue
  1094  		}
  1095  		// Atan(-z)  == -Atan(z)
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1118  			continue
  1119  		}
  1120  		// Atanh(Conj(z))  == Conj(Atanh(z))
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1126  			continue
  1127  		}
  1128  		// Atanh(-z)  == -Atanh(z)
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1163  			continue
  1164  		}
  1165  		// Cos(Conj(z))  == Cos(Cosh(z))
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1171  			continue
  1172  		}
  1173  		// Cos(-z)  == Cos(z)
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1191  			continue
  1192  		}
  1193  		// Cosh(Conj(z))  == Conj(Cosh(z))
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1199  			continue
  1200  		}
  1201  		// Cosh(-z)  == Cosh(z)
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1219  			continue
  1220  		}
  1221  		// Exp(Conj(z))  == Exp(Cosh(z))
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1246  			continue
  1247  		}
  1248  		// Log(Conj(z))  == Conj(Log(z))
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1271  			continue
  1272  		}
  1273  		// Log10(Conj(z))  == Conj(Log10(z))
  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  	// Special cases for Pow(0, c).
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1346  			continue
  1347  		}
  1348  		// Sin(Conj(z))  == Conj(Sin(z))
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1354  			continue
  1355  		}
  1356  		// Sin(-z)  == -Sin(z)
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1374  			continue
  1375  		}
  1376  		// Sinh(Conj(z))  == Conj(Sinh(z))
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1382  			continue
  1383  		}
  1384  		// Sinh(-z)  == -Sinh(z)
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1402  			continue
  1403  		}
  1404  		// Sqrt(Conj(z)) == Conj(Sqrt(z))
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1427  			continue
  1428  		}
  1429  		// Tan(Conj(z))  == Conj(Tan(z))
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1435  			continue
  1436  		}
  1437  		// Tan(-z)  == -Tan(z)
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1455  			continue
  1456  		}
  1457  		// Tanh(Conj(z))  == Conj(Tanh(z))
  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  			// Negating NaN is undefined with regard to the sign bit produced.
  1463  			continue
  1464  		}
  1465  		// Tanh(-z)  == -Tanh(z)
  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  // See issue 17577
  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