rsc.io/go@v0.0.0-20150416155037-e040fd465409/src/math/all_test.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package math_test
     6  
     7  import (
     8  	"fmt"
     9  	. "math"
    10  	"testing"
    11  )
    12  
    13  var vf = []float64{
    14  	4.9790119248836735e+00,
    15  	7.7388724745781045e+00,
    16  	-2.7688005719200159e-01,
    17  	-5.0106036182710749e+00,
    18  	9.6362937071984173e+00,
    19  	2.9263772392439646e+00,
    20  	5.2290834314593066e+00,
    21  	2.7279399104360102e+00,
    22  	1.8253080916808550e+00,
    23  	-8.6859247685756013e+00,
    24  }
    25  
    26  // The expected results below were computed by the high precision calculators
    27  // at http://keisan.casio.com/.  More exact input values (array vf[], above)
    28  // were obtained by printing them with "%.26f".  The answers were calculated
    29  // to 26 digits (by using the "Digit number" drop-down control of each
    30  // calculator).
    31  var acos = []float64{
    32  	1.0496193546107222142571536e+00,
    33  	6.8584012813664425171660692e-01,
    34  	1.5984878714577160325521819e+00,
    35  	2.0956199361475859327461799e+00,
    36  	2.7053008467824138592616927e-01,
    37  	1.2738121680361776018155625e+00,
    38  	1.0205369421140629186287407e+00,
    39  	1.2945003481781246062157835e+00,
    40  	1.3872364345374451433846657e+00,
    41  	2.6231510803970463967294145e+00,
    42  }
    43  var acosh = []float64{
    44  	2.4743347004159012494457618e+00,
    45  	2.8576385344292769649802701e+00,
    46  	7.2796961502981066190593175e-01,
    47  	2.4796794418831451156471977e+00,
    48  	3.0552020742306061857212962e+00,
    49  	2.044238592688586588942468e+00,
    50  	2.5158701513104513595766636e+00,
    51  	1.99050839282411638174299e+00,
    52  	1.6988625798424034227205445e+00,
    53  	2.9611454842470387925531875e+00,
    54  }
    55  var asin = []float64{
    56  	5.2117697218417440497416805e-01,
    57  	8.8495619865825236751471477e-01,
    58  	-02.769154466281941332086016e-02,
    59  	-5.2482360935268931351485822e-01,
    60  	1.3002662421166552333051524e+00,
    61  	2.9698415875871901741575922e-01,
    62  	5.5025938468083370060258102e-01,
    63  	2.7629597861677201301553823e-01,
    64  	1.83559892257451475846656e-01,
    65  	-1.0523547536021497774980928e+00,
    66  }
    67  var asinh = []float64{
    68  	2.3083139124923523427628243e+00,
    69  	2.743551594301593620039021e+00,
    70  	-2.7345908534880091229413487e-01,
    71  	-2.3145157644718338650499085e+00,
    72  	2.9613652154015058521951083e+00,
    73  	1.7949041616585821933067568e+00,
    74  	2.3564032905983506405561554e+00,
    75  	1.7287118790768438878045346e+00,
    76  	1.3626658083714826013073193e+00,
    77  	-2.8581483626513914445234004e+00,
    78  }
    79  var atan = []float64{
    80  	1.372590262129621651920085e+00,
    81  	1.442290609645298083020664e+00,
    82  	-2.7011324359471758245192595e-01,
    83  	-1.3738077684543379452781531e+00,
    84  	1.4673921193587666049154681e+00,
    85  	1.2415173565870168649117764e+00,
    86  	1.3818396865615168979966498e+00,
    87  	1.2194305844639670701091426e+00,
    88  	1.0696031952318783760193244e+00,
    89  	-1.4561721938838084990898679e+00,
    90  }
    91  var atanh = []float64{
    92  	5.4651163712251938116878204e-01,
    93  	1.0299474112843111224914709e+00,
    94  	-2.7695084420740135145234906e-02,
    95  	-5.5072096119207195480202529e-01,
    96  	1.9943940993171843235906642e+00,
    97  	3.01448604578089708203017e-01,
    98  	5.8033427206942188834370595e-01,
    99  	2.7987997499441511013958297e-01,
   100  	1.8459947964298794318714228e-01,
   101  	-1.3273186910532645867272502e+00,
   102  }
   103  var atan2 = []float64{
   104  	1.1088291730037004444527075e+00,
   105  	9.1218183188715804018797795e-01,
   106  	1.5984772603216203736068915e+00,
   107  	2.0352918654092086637227327e+00,
   108  	8.0391819139044720267356014e-01,
   109  	1.2861075249894661588866752e+00,
   110  	1.0889904479131695712182587e+00,
   111  	1.3044821793397925293797357e+00,
   112  	1.3902530903455392306872261e+00,
   113  	2.2859857424479142655411058e+00,
   114  }
   115  var cbrt = []float64{
   116  	1.7075799841925094446722675e+00,
   117  	1.9779982212970353936691498e+00,
   118  	-6.5177429017779910853339447e-01,
   119  	-1.7111838886544019873338113e+00,
   120  	2.1279920909827937423960472e+00,
   121  	1.4303536770460741452312367e+00,
   122  	1.7357021059106154902341052e+00,
   123  	1.3972633462554328350552916e+00,
   124  	1.2221149580905388454977636e+00,
   125  	-2.0556003730500069110343596e+00,
   126  }
   127  var ceil = []float64{
   128  	5.0000000000000000e+00,
   129  	8.0000000000000000e+00,
   130  	0.0000000000000000e+00,
   131  	-5.0000000000000000e+00,
   132  	1.0000000000000000e+01,
   133  	3.0000000000000000e+00,
   134  	6.0000000000000000e+00,
   135  	3.0000000000000000e+00,
   136  	2.0000000000000000e+00,
   137  	-8.0000000000000000e+00,
   138  }
   139  var copysign = []float64{
   140  	-4.9790119248836735e+00,
   141  	-7.7388724745781045e+00,
   142  	-2.7688005719200159e-01,
   143  	-5.0106036182710749e+00,
   144  	-9.6362937071984173e+00,
   145  	-2.9263772392439646e+00,
   146  	-5.2290834314593066e+00,
   147  	-2.7279399104360102e+00,
   148  	-1.8253080916808550e+00,
   149  	-8.6859247685756013e+00,
   150  }
   151  var cos = []float64{
   152  	2.634752140995199110787593e-01,
   153  	1.148551260848219865642039e-01,
   154  	9.6191297325640768154550453e-01,
   155  	2.938141150061714816890637e-01,
   156  	-9.777138189897924126294461e-01,
   157  	-9.7693041344303219127199518e-01,
   158  	4.940088096948647263961162e-01,
   159  	-9.1565869021018925545016502e-01,
   160  	-2.517729313893103197176091e-01,
   161  	-7.39241351595676573201918e-01,
   162  }
   163  
   164  // Results for 100000 * Pi + vf[i]
   165  var cosLarge = []float64{
   166  	2.634752141185559426744e-01,
   167  	1.14855126055543100712e-01,
   168  	9.61912973266488928113e-01,
   169  	2.9381411499556122552e-01,
   170  	-9.777138189880161924641e-01,
   171  	-9.76930413445147608049e-01,
   172  	4.940088097314976789841e-01,
   173  	-9.15658690217517835002e-01,
   174  	-2.51772931436786954751e-01,
   175  	-7.3924135157173099849e-01,
   176  }
   177  var cosh = []float64{
   178  	7.2668796942212842775517446e+01,
   179  	1.1479413465659254502011135e+03,
   180  	1.0385767908766418550935495e+00,
   181  	7.5000957789658051428857788e+01,
   182  	7.655246669605357888468613e+03,
   183  	9.3567491758321272072888257e+00,
   184  	9.331351599270605471131735e+01,
   185  	7.6833430994624643209296404e+00,
   186  	3.1829371625150718153881164e+00,
   187  	2.9595059261916188501640911e+03,
   188  }
   189  var erf = []float64{
   190  	5.1865354817738701906913566e-01,
   191  	7.2623875834137295116929844e-01,
   192  	-3.123458688281309990629839e-02,
   193  	-5.2143121110253302920437013e-01,
   194  	8.2704742671312902508629582e-01,
   195  	3.2101767558376376743993945e-01,
   196  	5.403990312223245516066252e-01,
   197  	3.0034702916738588551174831e-01,
   198  	2.0369924417882241241559589e-01,
   199  	-7.8069386968009226729944677e-01,
   200  }
   201  var erfc = []float64{
   202  	4.8134645182261298093086434e-01,
   203  	2.7376124165862704883070156e-01,
   204  	1.0312345868828130999062984e+00,
   205  	1.5214312111025330292043701e+00,
   206  	1.7295257328687097491370418e-01,
   207  	6.7898232441623623256006055e-01,
   208  	4.596009687776754483933748e-01,
   209  	6.9965297083261411448825169e-01,
   210  	7.9630075582117758758440411e-01,
   211  	1.7806938696800922672994468e+00,
   212  }
   213  var exp = []float64{
   214  	1.4533071302642137507696589e+02,
   215  	2.2958822575694449002537581e+03,
   216  	7.5814542574851666582042306e-01,
   217  	6.6668778421791005061482264e-03,
   218  	1.5310493273896033740861206e+04,
   219  	1.8659907517999328638667732e+01,
   220  	1.8662167355098714543942057e+02,
   221  	1.5301332413189378961665788e+01,
   222  	6.2047063430646876349125085e+00,
   223  	1.6894712385826521111610438e-04,
   224  }
   225  var expm1 = []float64{
   226  	5.105047796122957327384770212e-02,
   227  	8.046199708567344080562675439e-02,
   228  	-2.764970978891639815187418703e-03,
   229  	-4.8871434888875355394330300273e-02,
   230  	1.0115864277221467777117227494e-01,
   231  	2.969616407795910726014621657e-02,
   232  	5.368214487944892300914037972e-02,
   233  	2.765488851131274068067445335e-02,
   234  	1.842068661871398836913874273e-02,
   235  	-8.3193870863553801814961137573e-02,
   236  }
   237  var exp2 = []float64{
   238  	3.1537839463286288034313104e+01,
   239  	2.1361549283756232296144849e+02,
   240  	8.2537402562185562902577219e-01,
   241  	3.1021158628740294833424229e-02,
   242  	7.9581744110252191462569661e+02,
   243  	7.6019905892596359262696423e+00,
   244  	3.7506882048388096973183084e+01,
   245  	6.6250893439173561733216375e+00,
   246  	3.5438267900243941544605339e+00,
   247  	2.4281533133513300984289196e-03,
   248  }
   249  var fabs = []float64{
   250  	4.9790119248836735e+00,
   251  	7.7388724745781045e+00,
   252  	2.7688005719200159e-01,
   253  	5.0106036182710749e+00,
   254  	9.6362937071984173e+00,
   255  	2.9263772392439646e+00,
   256  	5.2290834314593066e+00,
   257  	2.7279399104360102e+00,
   258  	1.8253080916808550e+00,
   259  	8.6859247685756013e+00,
   260  }
   261  var fdim = []float64{
   262  	4.9790119248836735e+00,
   263  	7.7388724745781045e+00,
   264  	0.0000000000000000e+00,
   265  	0.0000000000000000e+00,
   266  	9.6362937071984173e+00,
   267  	2.9263772392439646e+00,
   268  	5.2290834314593066e+00,
   269  	2.7279399104360102e+00,
   270  	1.8253080916808550e+00,
   271  	0.0000000000000000e+00,
   272  }
   273  var floor = []float64{
   274  	4.0000000000000000e+00,
   275  	7.0000000000000000e+00,
   276  	-1.0000000000000000e+00,
   277  	-6.0000000000000000e+00,
   278  	9.0000000000000000e+00,
   279  	2.0000000000000000e+00,
   280  	5.0000000000000000e+00,
   281  	2.0000000000000000e+00,
   282  	1.0000000000000000e+00,
   283  	-9.0000000000000000e+00,
   284  }
   285  var fmod = []float64{
   286  	4.197615023265299782906368e-02,
   287  	2.261127525421895434476482e+00,
   288  	3.231794108794261433104108e-02,
   289  	4.989396381728925078391512e+00,
   290  	3.637062928015826201999516e-01,
   291  	1.220868282268106064236690e+00,
   292  	4.770916568540693347699744e+00,
   293  	1.816180268691969246219742e+00,
   294  	8.734595415957246977711748e-01,
   295  	1.314075231424398637614104e+00,
   296  }
   297  
   298  type fi struct {
   299  	f float64
   300  	i int
   301  }
   302  
   303  var frexp = []fi{
   304  	{6.2237649061045918750e-01, 3},
   305  	{9.6735905932226306250e-01, 3},
   306  	{-5.5376011438400318000e-01, -1},
   307  	{-6.2632545228388436250e-01, 3},
   308  	{6.02268356699901081250e-01, 4},
   309  	{7.3159430981099115000e-01, 2},
   310  	{6.5363542893241332500e-01, 3},
   311  	{6.8198497760900255000e-01, 2},
   312  	{9.1265404584042750000e-01, 1},
   313  	{-5.4287029803597508250e-01, 4},
   314  }
   315  var gamma = []float64{
   316  	2.3254348370739963835386613898e+01,
   317  	2.991153837155317076427529816e+03,
   318  	-4.561154336726758060575129109e+00,
   319  	7.719403468842639065959210984e-01,
   320  	1.6111876618855418534325755566e+05,
   321  	1.8706575145216421164173224946e+00,
   322  	3.4082787447257502836734201635e+01,
   323  	1.579733951448952054898583387e+00,
   324  	9.3834586598354592860187267089e-01,
   325  	-2.093995902923148389186189429e-05,
   326  }
   327  var j0 = []float64{
   328  	-1.8444682230601672018219338e-01,
   329  	2.27353668906331975435892e-01,
   330  	9.809259936157051116270273e-01,
   331  	-1.741170131426226587841181e-01,
   332  	-2.1389448451144143352039069e-01,
   333  	-2.340905848928038763337414e-01,
   334  	-1.0029099691890912094586326e-01,
   335  	-1.5466726714884328135358907e-01,
   336  	3.252650187653420388714693e-01,
   337  	-8.72218484409407250005360235e-03,
   338  }
   339  var j1 = []float64{
   340  	-3.251526395295203422162967e-01,
   341  	1.893581711430515718062564e-01,
   342  	-1.3711761352467242914491514e-01,
   343  	3.287486536269617297529617e-01,
   344  	1.3133899188830978473849215e-01,
   345  	3.660243417832986825301766e-01,
   346  	-3.4436769271848174665420672e-01,
   347  	4.329481396640773768835036e-01,
   348  	5.8181350531954794639333955e-01,
   349  	-2.7030574577733036112996607e-01,
   350  }
   351  var j2 = []float64{
   352  	5.3837518920137802565192769e-02,
   353  	-1.7841678003393207281244667e-01,
   354  	9.521746934916464142495821e-03,
   355  	4.28958355470987397983072e-02,
   356  	2.4115371837854494725492872e-01,
   357  	4.842458532394520316844449e-01,
   358  	-3.142145220618633390125946e-02,
   359  	4.720849184745124761189957e-01,
   360  	3.122312022520957042957497e-01,
   361  	7.096213118930231185707277e-02,
   362  }
   363  var jM3 = []float64{
   364  	-3.684042080996403091021151e-01,
   365  	2.8157665936340887268092661e-01,
   366  	4.401005480841948348343589e-04,
   367  	3.629926999056814081597135e-01,
   368  	3.123672198825455192489266e-02,
   369  	-2.958805510589623607540455e-01,
   370  	-3.2033177696533233403289416e-01,
   371  	-2.592737332129663376736604e-01,
   372  	-1.0241334641061485092351251e-01,
   373  	-2.3762660886100206491674503e-01,
   374  }
   375  var lgamma = []fi{
   376  	{3.146492141244545774319734e+00, 1},
   377  	{8.003414490659126375852113e+00, 1},
   378  	{1.517575735509779707488106e+00, -1},
   379  	{-2.588480028182145853558748e-01, 1},
   380  	{1.1989897050205555002007985e+01, 1},
   381  	{6.262899811091257519386906e-01, 1},
   382  	{3.5287924899091566764846037e+00, 1},
   383  	{4.5725644770161182299423372e-01, 1},
   384  	{-6.363667087767961257654854e-02, 1},
   385  	{-1.077385130910300066425564e+01, -1},
   386  }
   387  var log = []float64{
   388  	1.605231462693062999102599e+00,
   389  	2.0462560018708770653153909e+00,
   390  	-1.2841708730962657801275038e+00,
   391  	1.6115563905281545116286206e+00,
   392  	2.2655365644872016636317461e+00,
   393  	1.0737652208918379856272735e+00,
   394  	1.6542360106073546632707956e+00,
   395  	1.0035467127723465801264487e+00,
   396  	6.0174879014578057187016475e-01,
   397  	2.161703872847352815363655e+00,
   398  }
   399  var logb = []float64{
   400  	2.0000000000000000e+00,
   401  	2.0000000000000000e+00,
   402  	-2.0000000000000000e+00,
   403  	2.0000000000000000e+00,
   404  	3.0000000000000000e+00,
   405  	1.0000000000000000e+00,
   406  	2.0000000000000000e+00,
   407  	1.0000000000000000e+00,
   408  	0.0000000000000000e+00,
   409  	3.0000000000000000e+00,
   410  }
   411  var log10 = []float64{
   412  	6.9714316642508290997617083e-01,
   413  	8.886776901739320576279124e-01,
   414  	-5.5770832400658929815908236e-01,
   415  	6.998900476822994346229723e-01,
   416  	9.8391002850684232013281033e-01,
   417  	4.6633031029295153334285302e-01,
   418  	7.1842557117242328821552533e-01,
   419  	4.3583479968917773161304553e-01,
   420  	2.6133617905227038228626834e-01,
   421  	9.3881606348649405716214241e-01,
   422  }
   423  var log1p = []float64{
   424  	4.8590257759797794104158205e-02,
   425  	7.4540265965225865330849141e-02,
   426  	-2.7726407903942672823234024e-03,
   427  	-5.1404917651627649094953380e-02,
   428  	9.1998280672258624681335010e-02,
   429  	2.8843762576593352865894824e-02,
   430  	5.0969534581863707268992645e-02,
   431  	2.6913947602193238458458594e-02,
   432  	1.8088493239630770262045333e-02,
   433  	-9.0865245631588989681559268e-02,
   434  }
   435  var log2 = []float64{
   436  	2.3158594707062190618898251e+00,
   437  	2.9521233862883917703341018e+00,
   438  	-1.8526669502700329984917062e+00,
   439  	2.3249844127278861543568029e+00,
   440  	3.268478366538305087466309e+00,
   441  	1.5491157592596970278166492e+00,
   442  	2.3865580889631732407886495e+00,
   443  	1.447811865817085365540347e+00,
   444  	8.6813999540425116282815557e-01,
   445  	3.118679457227342224364709e+00,
   446  }
   447  var modf = [][2]float64{
   448  	{4.0000000000000000e+00, 9.7901192488367350108546816e-01},
   449  	{7.0000000000000000e+00, 7.3887247457810456552351752e-01},
   450  	{0.0000000000000000e+00, -2.7688005719200159404635997e-01},
   451  	{-5.0000000000000000e+00, -1.060361827107492160848778e-02},
   452  	{9.0000000000000000e+00, 6.3629370719841737980004837e-01},
   453  	{2.0000000000000000e+00, 9.2637723924396464525443662e-01},
   454  	{5.0000000000000000e+00, 2.2908343145930665230025625e-01},
   455  	{2.0000000000000000e+00, 7.2793991043601025126008608e-01},
   456  	{1.0000000000000000e+00, 8.2530809168085506044576505e-01},
   457  	{-8.0000000000000000e+00, -6.8592476857560136238589621e-01},
   458  }
   459  var nextafter32 = []float32{
   460  	4.979012489318848e+00,
   461  	7.738873004913330e+00,
   462  	-2.768800258636475e-01,
   463  	-5.010602951049805e+00,
   464  	9.636294364929199e+00,
   465  	2.926377534866333e+00,
   466  	5.229084014892578e+00,
   467  	2.727940082550049e+00,
   468  	1.825308203697205e+00,
   469  	-8.685923576354980e+00,
   470  }
   471  var nextafter64 = []float64{
   472  	4.97901192488367438926388786e+00,
   473  	7.73887247457810545370193722e+00,
   474  	-2.7688005719200153853520874e-01,
   475  	-5.01060361827107403343006808e+00,
   476  	9.63629370719841915615688777e+00,
   477  	2.92637723924396508934364647e+00,
   478  	5.22908343145930754047867595e+00,
   479  	2.72793991043601069534929593e+00,
   480  	1.82530809168085528249036997e+00,
   481  	-8.68592476857559958602905681e+00,
   482  }
   483  var pow = []float64{
   484  	9.5282232631648411840742957e+04,
   485  	5.4811599352999901232411871e+07,
   486  	5.2859121715894396531132279e-01,
   487  	9.7587991957286474464259698e-06,
   488  	4.328064329346044846740467e+09,
   489  	8.4406761805034547437659092e+02,
   490  	1.6946633276191194947742146e+05,
   491  	5.3449040147551939075312879e+02,
   492  	6.688182138451414936380374e+01,
   493  	2.0609869004248742886827439e-09,
   494  }
   495  var remainder = []float64{
   496  	4.197615023265299782906368e-02,
   497  	2.261127525421895434476482e+00,
   498  	3.231794108794261433104108e-02,
   499  	-2.120723654214984321697556e-02,
   500  	3.637062928015826201999516e-01,
   501  	1.220868282268106064236690e+00,
   502  	-4.581668629186133046005125e-01,
   503  	-9.117596417440410050403443e-01,
   504  	8.734595415957246977711748e-01,
   505  	1.314075231424398637614104e+00,
   506  }
   507  var signbit = []bool{
   508  	false,
   509  	false,
   510  	true,
   511  	true,
   512  	false,
   513  	false,
   514  	false,
   515  	false,
   516  	false,
   517  	true,
   518  }
   519  var sin = []float64{
   520  	-9.6466616586009283766724726e-01,
   521  	9.9338225271646545763467022e-01,
   522  	-2.7335587039794393342449301e-01,
   523  	9.5586257685042792878173752e-01,
   524  	-2.099421066779969164496634e-01,
   525  	2.135578780799860532750616e-01,
   526  	-8.694568971167362743327708e-01,
   527  	4.019566681155577786649878e-01,
   528  	9.6778633541687993721617774e-01,
   529  	-6.734405869050344734943028e-01,
   530  }
   531  
   532  // Results for 100000 * Pi + vf[i]
   533  var sinLarge = []float64{
   534  	-9.646661658548936063912e-01,
   535  	9.933822527198506903752e-01,
   536  	-2.7335587036246899796e-01,
   537  	9.55862576853689321268e-01,
   538  	-2.099421066862688873691e-01,
   539  	2.13557878070308981163e-01,
   540  	-8.694568970959221300497e-01,
   541  	4.01956668098863248917e-01,
   542  	9.67786335404528727927e-01,
   543  	-6.7344058693131973066e-01,
   544  }
   545  var sinh = []float64{
   546  	7.2661916084208532301448439e+01,
   547  	1.1479409110035194500526446e+03,
   548  	-2.8043136512812518927312641e-01,
   549  	-7.499429091181587232835164e+01,
   550  	7.6552466042906758523925934e+03,
   551  	9.3031583421672014313789064e+00,
   552  	9.330815755828109072810322e+01,
   553  	7.6179893137269146407361477e+00,
   554  	3.021769180549615819524392e+00,
   555  	-2.95950575724449499189888e+03,
   556  }
   557  var sqrt = []float64{
   558  	2.2313699659365484748756904e+00,
   559  	2.7818829009464263511285458e+00,
   560  	5.2619393496314796848143251e-01,
   561  	2.2384377628763938724244104e+00,
   562  	3.1042380236055381099288487e+00,
   563  	1.7106657298385224403917771e+00,
   564  	2.286718922705479046148059e+00,
   565  	1.6516476350711159636222979e+00,
   566  	1.3510396336454586262419247e+00,
   567  	2.9471892997524949215723329e+00,
   568  }
   569  var tan = []float64{
   570  	-3.661316565040227801781974e+00,
   571  	8.64900232648597589369854e+00,
   572  	-2.8417941955033612725238097e-01,
   573  	3.253290185974728640827156e+00,
   574  	2.147275640380293804770778e-01,
   575  	-2.18600910711067004921551e-01,
   576  	-1.760002817872367935518928e+00,
   577  	-4.389808914752818126249079e-01,
   578  	-3.843885560201130679995041e+00,
   579  	9.10988793377685105753416e-01,
   580  }
   581  
   582  // Results for 100000 * Pi + vf[i]
   583  var tanLarge = []float64{
   584  	-3.66131656475596512705e+00,
   585  	8.6490023287202547927e+00,
   586  	-2.841794195104782406e-01,
   587  	3.2532901861033120983e+00,
   588  	2.14727564046880001365e-01,
   589  	-2.18600910700688062874e-01,
   590  	-1.760002817699722747043e+00,
   591  	-4.38980891453536115952e-01,
   592  	-3.84388555942723509071e+00,
   593  	9.1098879344275101051e-01,
   594  }
   595  var tanh = []float64{
   596  	9.9990531206936338549262119e-01,
   597  	9.9999962057085294197613294e-01,
   598  	-2.7001505097318677233756845e-01,
   599  	-9.9991110943061718603541401e-01,
   600  	9.9999999146798465745022007e-01,
   601  	9.9427249436125236705001048e-01,
   602  	9.9994257600983138572705076e-01,
   603  	9.9149409509772875982054701e-01,
   604  	9.4936501296239685514466577e-01,
   605  	-9.9999994291374030946055701e-01,
   606  }
   607  var trunc = []float64{
   608  	4.0000000000000000e+00,
   609  	7.0000000000000000e+00,
   610  	-0.0000000000000000e+00,
   611  	-5.0000000000000000e+00,
   612  	9.0000000000000000e+00,
   613  	2.0000000000000000e+00,
   614  	5.0000000000000000e+00,
   615  	2.0000000000000000e+00,
   616  	1.0000000000000000e+00,
   617  	-8.0000000000000000e+00,
   618  }
   619  var y0 = []float64{
   620  	-3.053399153780788357534855e-01,
   621  	1.7437227649515231515503649e-01,
   622  	-8.6221781263678836910392572e-01,
   623  	-3.100664880987498407872839e-01,
   624  	1.422200649300982280645377e-01,
   625  	4.000004067997901144239363e-01,
   626  	-3.3340749753099352392332536e-01,
   627  	4.5399790746668954555205502e-01,
   628  	4.8290004112497761007536522e-01,
   629  	2.7036697826604756229601611e-01,
   630  }
   631  var y1 = []float64{
   632  	0.15494213737457922210218611,
   633  	-0.2165955142081145245075746,
   634  	-2.4644949631241895201032829,
   635  	0.1442740489541836405154505,
   636  	0.2215379960518984777080163,
   637  	0.3038800915160754150565448,
   638  	0.0691107642452362383808547,
   639  	0.2380116417809914424860165,
   640  	-0.20849492979459761009678934,
   641  	0.0242503179793232308250804,
   642  }
   643  var y2 = []float64{
   644  	0.3675780219390303613394936,
   645  	-0.23034826393250119879267257,
   646  	-16.939677983817727205631397,
   647  	0.367653980523052152867791,
   648  	-0.0962401471767804440353136,
   649  	-0.1923169356184851105200523,
   650  	0.35984072054267882391843766,
   651  	-0.2794987252299739821654982,
   652  	-0.7113490692587462579757954,
   653  	-0.2647831587821263302087457,
   654  }
   655  var yM3 = []float64{
   656  	-0.14035984421094849100895341,
   657  	-0.097535139617792072703973,
   658  	242.25775994555580176377379,
   659  	-0.1492267014802818619511046,
   660  	0.26148702629155918694500469,
   661  	0.56675383593895176530394248,
   662  	-0.206150264009006981070575,
   663  	0.64784284687568332737963658,
   664  	1.3503631555901938037008443,
   665  	0.1461869756579956803341844,
   666  }
   667  
   668  // arguments and expected results for special cases
   669  var vfacosSC = []float64{
   670  	-Pi,
   671  	1,
   672  	Pi,
   673  	NaN(),
   674  }
   675  var acosSC = []float64{
   676  	NaN(),
   677  	0,
   678  	NaN(),
   679  	NaN(),
   680  }
   681  
   682  var vfacoshSC = []float64{
   683  	Inf(-1),
   684  	0.5,
   685  	1,
   686  	Inf(1),
   687  	NaN(),
   688  }
   689  var acoshSC = []float64{
   690  	NaN(),
   691  	NaN(),
   692  	0,
   693  	Inf(1),
   694  	NaN(),
   695  }
   696  
   697  var vfasinSC = []float64{
   698  	-Pi,
   699  	Copysign(0, -1),
   700  	0,
   701  	Pi,
   702  	NaN(),
   703  }
   704  var asinSC = []float64{
   705  	NaN(),
   706  	Copysign(0, -1),
   707  	0,
   708  	NaN(),
   709  	NaN(),
   710  }
   711  
   712  var vfasinhSC = []float64{
   713  	Inf(-1),
   714  	Copysign(0, -1),
   715  	0,
   716  	Inf(1),
   717  	NaN(),
   718  }
   719  var asinhSC = []float64{
   720  	Inf(-1),
   721  	Copysign(0, -1),
   722  	0,
   723  	Inf(1),
   724  	NaN(),
   725  }
   726  
   727  var vfatanSC = []float64{
   728  	Inf(-1),
   729  	Copysign(0, -1),
   730  	0,
   731  	Inf(1),
   732  	NaN(),
   733  }
   734  var atanSC = []float64{
   735  	-Pi / 2,
   736  	Copysign(0, -1),
   737  	0,
   738  	Pi / 2,
   739  	NaN(),
   740  }
   741  
   742  var vfatanhSC = []float64{
   743  	Inf(-1),
   744  	-Pi,
   745  	-1,
   746  	Copysign(0, -1),
   747  	0,
   748  	1,
   749  	Pi,
   750  	Inf(1),
   751  	NaN(),
   752  }
   753  var atanhSC = []float64{
   754  	NaN(),
   755  	NaN(),
   756  	Inf(-1),
   757  	Copysign(0, -1),
   758  	0,
   759  	Inf(1),
   760  	NaN(),
   761  	NaN(),
   762  	NaN(),
   763  }
   764  var vfatan2SC = [][2]float64{
   765  	{Inf(-1), Inf(-1)},
   766  	{Inf(-1), -Pi},
   767  	{Inf(-1), 0},
   768  	{Inf(-1), +Pi},
   769  	{Inf(-1), Inf(1)},
   770  	{Inf(-1), NaN()},
   771  	{-Pi, Inf(-1)},
   772  	{-Pi, 0},
   773  	{-Pi, Inf(1)},
   774  	{-Pi, NaN()},
   775  	{Copysign(0, -1), Inf(-1)},
   776  	{Copysign(0, -1), -Pi},
   777  	{Copysign(0, -1), Copysign(0, -1)},
   778  	{Copysign(0, -1), 0},
   779  	{Copysign(0, -1), +Pi},
   780  	{Copysign(0, -1), Inf(1)},
   781  	{Copysign(0, -1), NaN()},
   782  	{0, Inf(-1)},
   783  	{0, -Pi},
   784  	{0, Copysign(0, -1)},
   785  	{0, 0},
   786  	{0, +Pi},
   787  	{0, Inf(1)},
   788  	{0, NaN()},
   789  	{+Pi, Inf(-1)},
   790  	{+Pi, 0},
   791  	{+Pi, Inf(1)},
   792  	{+Pi, NaN()},
   793  	{Inf(1), Inf(-1)},
   794  	{Inf(1), -Pi},
   795  	{Inf(1), 0},
   796  	{Inf(1), +Pi},
   797  	{Inf(1), Inf(1)},
   798  	{Inf(1), NaN()},
   799  	{NaN(), NaN()},
   800  }
   801  var atan2SC = []float64{
   802  	-3 * Pi / 4,     // atan2(-Inf, -Inf)
   803  	-Pi / 2,         // atan2(-Inf, -Pi)
   804  	-Pi / 2,         // atan2(-Inf, +0)
   805  	-Pi / 2,         // atan2(-Inf, +Pi)
   806  	-Pi / 4,         // atan2(-Inf, +Inf)
   807  	NaN(),           // atan2(-Inf, NaN)
   808  	-Pi,             // atan2(-Pi, -Inf)
   809  	-Pi / 2,         // atan2(-Pi, +0)
   810  	Copysign(0, -1), // atan2(-Pi, Inf)
   811  	NaN(),           // atan2(-Pi, NaN)
   812  	-Pi,             // atan2(-0, -Inf)
   813  	-Pi,             // atan2(-0, -Pi)
   814  	-Pi,             // atan2(-0, -0)
   815  	Copysign(0, -1), // atan2(-0, +0)
   816  	Copysign(0, -1), // atan2(-0, +Pi)
   817  	Copysign(0, -1), // atan2(-0, +Inf)
   818  	NaN(),           // atan2(-0, NaN)
   819  	Pi,              // atan2(+0, -Inf)
   820  	Pi,              // atan2(+0, -Pi)
   821  	Pi,              // atan2(+0, -0)
   822  	0,               // atan2(+0, +0)
   823  	0,               // atan2(+0, +Pi)
   824  	0,               // atan2(+0, +Inf)
   825  	NaN(),           // atan2(+0, NaN)
   826  	Pi,              // atan2(+Pi, -Inf)
   827  	Pi / 2,          // atan2(+Pi, +0)
   828  	0,               // atan2(+Pi, +Inf)
   829  	NaN(),           // atan2(+Pi, NaN)
   830  	3 * Pi / 4,      // atan2(+Inf, -Inf)
   831  	Pi / 2,          // atan2(+Inf, -Pi)
   832  	Pi / 2,          // atan2(+Inf, +0)
   833  	Pi / 2,          // atan2(+Inf, +Pi)
   834  	Pi / 4,          // atan2(+Inf, +Inf)
   835  	NaN(),           // atan2(+Inf, NaN)
   836  	NaN(),           // atan2(NaN, NaN)
   837  }
   838  
   839  var vfcbrtSC = []float64{
   840  	Inf(-1),
   841  	Copysign(0, -1),
   842  	0,
   843  	Inf(1),
   844  	NaN(),
   845  }
   846  var cbrtSC = []float64{
   847  	Inf(-1),
   848  	Copysign(0, -1),
   849  	0,
   850  	Inf(1),
   851  	NaN(),
   852  }
   853  
   854  var vfceilSC = []float64{
   855  	Inf(-1),
   856  	Copysign(0, -1),
   857  	0,
   858  	Inf(1),
   859  	NaN(),
   860  }
   861  var ceilSC = []float64{
   862  	Inf(-1),
   863  	Copysign(0, -1),
   864  	0,
   865  	Inf(1),
   866  	NaN(),
   867  }
   868  
   869  var vfcopysignSC = []float64{
   870  	Inf(-1),
   871  	Inf(1),
   872  	NaN(),
   873  }
   874  var copysignSC = []float64{
   875  	Inf(-1),
   876  	Inf(-1),
   877  	NaN(),
   878  }
   879  
   880  var vfcosSC = []float64{
   881  	Inf(-1),
   882  	Inf(1),
   883  	NaN(),
   884  }
   885  var cosSC = []float64{
   886  	NaN(),
   887  	NaN(),
   888  	NaN(),
   889  }
   890  
   891  var vfcoshSC = []float64{
   892  	Inf(-1),
   893  	Copysign(0, -1),
   894  	0,
   895  	Inf(1),
   896  	NaN(),
   897  }
   898  var coshSC = []float64{
   899  	Inf(1),
   900  	1,
   901  	1,
   902  	Inf(1),
   903  	NaN(),
   904  }
   905  
   906  var vferfSC = []float64{
   907  	Inf(-1),
   908  	Copysign(0, -1),
   909  	0,
   910  	Inf(1),
   911  	NaN(),
   912  }
   913  var erfSC = []float64{
   914  	-1,
   915  	Copysign(0, -1),
   916  	0,
   917  	1,
   918  	NaN(),
   919  }
   920  
   921  var vferfcSC = []float64{
   922  	Inf(-1),
   923  	Inf(1),
   924  	NaN(),
   925  }
   926  var erfcSC = []float64{
   927  	2,
   928  	0,
   929  	NaN(),
   930  }
   931  
   932  var vfexpSC = []float64{
   933  	Inf(-1),
   934  	-2000,
   935  	2000,
   936  	Inf(1),
   937  	NaN(),
   938  }
   939  var expSC = []float64{
   940  	0,
   941  	0,
   942  	Inf(1),
   943  	Inf(1),
   944  	NaN(),
   945  }
   946  
   947  var vfexpm1SC = []float64{
   948  	Inf(-1),
   949  	Copysign(0, -1),
   950  	0,
   951  	Inf(1),
   952  	NaN(),
   953  }
   954  var expm1SC = []float64{
   955  	-1,
   956  	Copysign(0, -1),
   957  	0,
   958  	Inf(1),
   959  	NaN(),
   960  }
   961  
   962  var vffabsSC = []float64{
   963  	Inf(-1),
   964  	Copysign(0, -1),
   965  	0,
   966  	Inf(1),
   967  	NaN(),
   968  }
   969  var fabsSC = []float64{
   970  	Inf(1),
   971  	0,
   972  	0,
   973  	Inf(1),
   974  	NaN(),
   975  }
   976  
   977  var vffdimSC = [][2]float64{
   978  	{Inf(-1), Inf(-1)},
   979  	{Inf(-1), Inf(1)},
   980  	{Inf(-1), NaN()},
   981  	{Copysign(0, -1), Copysign(0, -1)},
   982  	{Copysign(0, -1), 0},
   983  	{0, Copysign(0, -1)},
   984  	{0, 0},
   985  	{Inf(1), Inf(-1)},
   986  	{Inf(1), Inf(1)},
   987  	{Inf(1), NaN()},
   988  	{NaN(), Inf(-1)},
   989  	{NaN(), Copysign(0, -1)},
   990  	{NaN(), 0},
   991  	{NaN(), Inf(1)},
   992  	{NaN(), NaN()},
   993  }
   994  var nan = Float64frombits(0xFFF8000000000000) // SSE2 DIVSD 0/0
   995  var vffdim2SC = [][2]float64{
   996  	{Inf(-1), Inf(-1)},
   997  	{Inf(-1), Inf(1)},
   998  	{Inf(-1), nan},
   999  	{Copysign(0, -1), Copysign(0, -1)},
  1000  	{Copysign(0, -1), 0},
  1001  	{0, Copysign(0, -1)},
  1002  	{0, 0},
  1003  	{Inf(1), Inf(-1)},
  1004  	{Inf(1), Inf(1)},
  1005  	{Inf(1), nan},
  1006  	{nan, Inf(-1)},
  1007  	{nan, Copysign(0, -1)},
  1008  	{nan, 0},
  1009  	{nan, Inf(1)},
  1010  	{nan, nan},
  1011  }
  1012  var fdimSC = []float64{
  1013  	NaN(),
  1014  	0,
  1015  	NaN(),
  1016  	0,
  1017  	0,
  1018  	0,
  1019  	0,
  1020  	Inf(1),
  1021  	NaN(),
  1022  	NaN(),
  1023  	NaN(),
  1024  	NaN(),
  1025  	NaN(),
  1026  	NaN(),
  1027  	NaN(),
  1028  }
  1029  var fmaxSC = []float64{
  1030  	Inf(-1),
  1031  	Inf(1),
  1032  	NaN(),
  1033  	Copysign(0, -1),
  1034  	0,
  1035  	0,
  1036  	0,
  1037  	Inf(1),
  1038  	Inf(1),
  1039  	Inf(1),
  1040  	NaN(),
  1041  	NaN(),
  1042  	NaN(),
  1043  	Inf(1),
  1044  	NaN(),
  1045  }
  1046  var fminSC = []float64{
  1047  	Inf(-1),
  1048  	Inf(-1),
  1049  	Inf(-1),
  1050  	Copysign(0, -1),
  1051  	Copysign(0, -1),
  1052  	Copysign(0, -1),
  1053  	0,
  1054  	Inf(-1),
  1055  	Inf(1),
  1056  	NaN(),
  1057  	Inf(-1),
  1058  	NaN(),
  1059  	NaN(),
  1060  	NaN(),
  1061  	NaN(),
  1062  }
  1063  
  1064  var vffmodSC = [][2]float64{
  1065  	{Inf(-1), Inf(-1)},
  1066  	{Inf(-1), -Pi},
  1067  	{Inf(-1), 0},
  1068  	{Inf(-1), Pi},
  1069  	{Inf(-1), Inf(1)},
  1070  	{Inf(-1), NaN()},
  1071  	{-Pi, Inf(-1)},
  1072  	{-Pi, 0},
  1073  	{-Pi, Inf(1)},
  1074  	{-Pi, NaN()},
  1075  	{Copysign(0, -1), Inf(-1)},
  1076  	{Copysign(0, -1), 0},
  1077  	{Copysign(0, -1), Inf(1)},
  1078  	{Copysign(0, -1), NaN()},
  1079  	{0, Inf(-1)},
  1080  	{0, 0},
  1081  	{0, Inf(1)},
  1082  	{0, NaN()},
  1083  	{Pi, Inf(-1)},
  1084  	{Pi, 0},
  1085  	{Pi, Inf(1)},
  1086  	{Pi, NaN()},
  1087  	{Inf(1), Inf(-1)},
  1088  	{Inf(1), -Pi},
  1089  	{Inf(1), 0},
  1090  	{Inf(1), Pi},
  1091  	{Inf(1), Inf(1)},
  1092  	{Inf(1), NaN()},
  1093  	{NaN(), Inf(-1)},
  1094  	{NaN(), -Pi},
  1095  	{NaN(), 0},
  1096  	{NaN(), Pi},
  1097  	{NaN(), Inf(1)},
  1098  	{NaN(), NaN()},
  1099  }
  1100  var fmodSC = []float64{
  1101  	NaN(),           // fmod(-Inf, -Inf)
  1102  	NaN(),           // fmod(-Inf, -Pi)
  1103  	NaN(),           // fmod(-Inf, 0)
  1104  	NaN(),           // fmod(-Inf, Pi)
  1105  	NaN(),           // fmod(-Inf, +Inf)
  1106  	NaN(),           // fmod(-Inf, NaN)
  1107  	-Pi,             // fmod(-Pi, -Inf)
  1108  	NaN(),           // fmod(-Pi, 0)
  1109  	-Pi,             // fmod(-Pi, +Inf)
  1110  	NaN(),           // fmod(-Pi, NaN)
  1111  	Copysign(0, -1), // fmod(-0, -Inf)
  1112  	NaN(),           // fmod(-0, 0)
  1113  	Copysign(0, -1), // fmod(-0, Inf)
  1114  	NaN(),           // fmod(-0, NaN)
  1115  	0,               // fmod(0, -Inf)
  1116  	NaN(),           // fmod(0, 0)
  1117  	0,               // fmod(0, +Inf)
  1118  	NaN(),           // fmod(0, NaN)
  1119  	Pi,              // fmod(Pi, -Inf)
  1120  	NaN(),           // fmod(Pi, 0)
  1121  	Pi,              // fmod(Pi, +Inf)
  1122  	NaN(),           // fmod(Pi, NaN)
  1123  	NaN(),           // fmod(+Inf, -Inf)
  1124  	NaN(),           // fmod(+Inf, -Pi)
  1125  	NaN(),           // fmod(+Inf, 0)
  1126  	NaN(),           // fmod(+Inf, Pi)
  1127  	NaN(),           // fmod(+Inf, +Inf)
  1128  	NaN(),           // fmod(+Inf, NaN)
  1129  	NaN(),           // fmod(NaN, -Inf)
  1130  	NaN(),           // fmod(NaN, -Pi)
  1131  	NaN(),           // fmod(NaN, 0)
  1132  	NaN(),           // fmod(NaN, Pi)
  1133  	NaN(),           // fmod(NaN, +Inf)
  1134  	NaN(),           // fmod(NaN, NaN)
  1135  }
  1136  
  1137  var vffrexpSC = []float64{
  1138  	Inf(-1),
  1139  	Copysign(0, -1),
  1140  	0,
  1141  	Inf(1),
  1142  	NaN(),
  1143  }
  1144  var frexpSC = []fi{
  1145  	{Inf(-1), 0},
  1146  	{Copysign(0, -1), 0},
  1147  	{0, 0},
  1148  	{Inf(1), 0},
  1149  	{NaN(), 0},
  1150  }
  1151  
  1152  var vfgammaSC = []float64{
  1153  	Inf(-1),
  1154  	-3,
  1155  	Copysign(0, -1),
  1156  	0,
  1157  	Inf(1),
  1158  	NaN(),
  1159  }
  1160  var gammaSC = []float64{
  1161  	NaN(),
  1162  	NaN(),
  1163  	Inf(-1),
  1164  	Inf(1),
  1165  	Inf(1),
  1166  	NaN(),
  1167  }
  1168  
  1169  var vfhypotSC = [][2]float64{
  1170  	{Inf(-1), Inf(-1)},
  1171  	{Inf(-1), 0},
  1172  	{Inf(-1), Inf(1)},
  1173  	{Inf(-1), NaN()},
  1174  	{Copysign(0, -1), Copysign(0, -1)},
  1175  	{Copysign(0, -1), 0},
  1176  	{0, Copysign(0, -1)},
  1177  	{0, 0}, // +0, +0
  1178  	{0, Inf(-1)},
  1179  	{0, Inf(1)},
  1180  	{0, NaN()},
  1181  	{Inf(1), Inf(-1)},
  1182  	{Inf(1), 0},
  1183  	{Inf(1), Inf(1)},
  1184  	{Inf(1), NaN()},
  1185  	{NaN(), Inf(-1)},
  1186  	{NaN(), 0},
  1187  	{NaN(), Inf(1)},
  1188  	{NaN(), NaN()},
  1189  }
  1190  var hypotSC = []float64{
  1191  	Inf(1),
  1192  	Inf(1),
  1193  	Inf(1),
  1194  	Inf(1),
  1195  	0,
  1196  	0,
  1197  	0,
  1198  	0,
  1199  	Inf(1),
  1200  	Inf(1),
  1201  	NaN(),
  1202  	Inf(1),
  1203  	Inf(1),
  1204  	Inf(1),
  1205  	Inf(1),
  1206  	Inf(1),
  1207  	NaN(),
  1208  	Inf(1),
  1209  	NaN(),
  1210  }
  1211  
  1212  var vfilogbSC = []float64{
  1213  	Inf(-1),
  1214  	0,
  1215  	Inf(1),
  1216  	NaN(),
  1217  }
  1218  var ilogbSC = []int{
  1219  	MaxInt32,
  1220  	MinInt32,
  1221  	MaxInt32,
  1222  	MaxInt32,
  1223  }
  1224  
  1225  var vfj0SC = []float64{
  1226  	Inf(-1),
  1227  	0,
  1228  	Inf(1),
  1229  	NaN(),
  1230  }
  1231  var j0SC = []float64{
  1232  	0,
  1233  	1,
  1234  	0,
  1235  	NaN(),
  1236  }
  1237  var j1SC = []float64{
  1238  	0,
  1239  	0,
  1240  	0,
  1241  	NaN(),
  1242  }
  1243  var j2SC = []float64{
  1244  	0,
  1245  	0,
  1246  	0,
  1247  	NaN(),
  1248  }
  1249  var jM3SC = []float64{
  1250  	0,
  1251  	0,
  1252  	0,
  1253  	NaN(),
  1254  }
  1255  
  1256  var vfldexpSC = []fi{
  1257  	{0, 0},
  1258  	{0, -1075},
  1259  	{0, 1024},
  1260  	{Copysign(0, -1), 0},
  1261  	{Copysign(0, -1), -1075},
  1262  	{Copysign(0, -1), 1024},
  1263  	{Inf(1), 0},
  1264  	{Inf(1), -1024},
  1265  	{Inf(-1), 0},
  1266  	{Inf(-1), -1024},
  1267  	{NaN(), -1024},
  1268  }
  1269  var ldexpSC = []float64{
  1270  	0,
  1271  	0,
  1272  	0,
  1273  	Copysign(0, -1),
  1274  	Copysign(0, -1),
  1275  	Copysign(0, -1),
  1276  	Inf(1),
  1277  	Inf(1),
  1278  	Inf(-1),
  1279  	Inf(-1),
  1280  	NaN(),
  1281  }
  1282  
  1283  var vflgammaSC = []float64{
  1284  	Inf(-1),
  1285  	-3,
  1286  	0,
  1287  	1,
  1288  	2,
  1289  	Inf(1),
  1290  	NaN(),
  1291  }
  1292  var lgammaSC = []fi{
  1293  	{Inf(-1), 1},
  1294  	{Inf(1), 1},
  1295  	{Inf(1), 1},
  1296  	{0, 1},
  1297  	{0, 1},
  1298  	{Inf(1), 1},
  1299  	{NaN(), 1},
  1300  }
  1301  
  1302  var vflogSC = []float64{
  1303  	Inf(-1),
  1304  	-Pi,
  1305  	Copysign(0, -1),
  1306  	0,
  1307  	1,
  1308  	Inf(1),
  1309  	NaN(),
  1310  }
  1311  var logSC = []float64{
  1312  	NaN(),
  1313  	NaN(),
  1314  	Inf(-1),
  1315  	Inf(-1),
  1316  	0,
  1317  	Inf(1),
  1318  	NaN(),
  1319  }
  1320  
  1321  var vflogbSC = []float64{
  1322  	Inf(-1),
  1323  	0,
  1324  	Inf(1),
  1325  	NaN(),
  1326  }
  1327  var logbSC = []float64{
  1328  	Inf(1),
  1329  	Inf(-1),
  1330  	Inf(1),
  1331  	NaN(),
  1332  }
  1333  
  1334  var vflog1pSC = []float64{
  1335  	Inf(-1),
  1336  	-Pi,
  1337  	-1,
  1338  	Copysign(0, -1),
  1339  	0,
  1340  	Inf(1),
  1341  	NaN(),
  1342  }
  1343  var log1pSC = []float64{
  1344  	NaN(),
  1345  	NaN(),
  1346  	Inf(-1),
  1347  	Copysign(0, -1),
  1348  	0,
  1349  	Inf(1),
  1350  	NaN(),
  1351  }
  1352  
  1353  var vfmodfSC = []float64{
  1354  	Inf(-1),
  1355  	Inf(1),
  1356  	NaN(),
  1357  }
  1358  var modfSC = [][2]float64{
  1359  	{Inf(-1), NaN()}, // [2]float64{Copysign(0, -1), Inf(-1)},
  1360  	{Inf(1), NaN()},  // [2]float64{0, Inf(1)},
  1361  	{NaN(), NaN()},
  1362  }
  1363  
  1364  var vfnextafter32SC = [][2]float32{
  1365  	{0, 0},
  1366  	{0, float32(Copysign(0, -1))},
  1367  	{0, -1},
  1368  	{0, float32(NaN())},
  1369  	{float32(Copysign(0, -1)), 1},
  1370  	{float32(Copysign(0, -1)), 0},
  1371  	{float32(Copysign(0, -1)), float32(Copysign(0, -1))},
  1372  	{float32(Copysign(0, -1)), -1},
  1373  	{float32(NaN()), 0},
  1374  	{float32(NaN()), float32(NaN())},
  1375  }
  1376  var nextafter32SC = []float32{
  1377  	0,
  1378  	0,
  1379  	-1.401298464e-45, // Float32frombits(0x80000001)
  1380  	float32(NaN()),
  1381  	1.401298464e-45, // Float32frombits(0x00000001)
  1382  	float32(Copysign(0, -1)),
  1383  	float32(Copysign(0, -1)),
  1384  	-1.401298464e-45, // Float32frombits(0x80000001)
  1385  	float32(NaN()),
  1386  	float32(NaN()),
  1387  }
  1388  
  1389  var vfnextafter64SC = [][2]float64{
  1390  	{0, 0},
  1391  	{0, Copysign(0, -1)},
  1392  	{0, -1},
  1393  	{0, NaN()},
  1394  	{Copysign(0, -1), 1},
  1395  	{Copysign(0, -1), 0},
  1396  	{Copysign(0, -1), Copysign(0, -1)},
  1397  	{Copysign(0, -1), -1},
  1398  	{NaN(), 0},
  1399  	{NaN(), NaN()},
  1400  }
  1401  var nextafter64SC = []float64{
  1402  	0,
  1403  	0,
  1404  	-4.9406564584124654418e-324, // Float64frombits(0x8000000000000001)
  1405  	NaN(),
  1406  	4.9406564584124654418e-324, // Float64frombits(0x0000000000000001)
  1407  	Copysign(0, -1),
  1408  	Copysign(0, -1),
  1409  	-4.9406564584124654418e-324, // Float64frombits(0x8000000000000001)
  1410  	NaN(),
  1411  	NaN(),
  1412  }
  1413  
  1414  var vfpowSC = [][2]float64{
  1415  	{Inf(-1), -Pi},
  1416  	{Inf(-1), -3},
  1417  	{Inf(-1), Copysign(0, -1)},
  1418  	{Inf(-1), 0},
  1419  	{Inf(-1), 1},
  1420  	{Inf(-1), 3},
  1421  	{Inf(-1), Pi},
  1422  	{Inf(-1), NaN()},
  1423  
  1424  	{-Pi, Inf(-1)},
  1425  	{-Pi, -Pi},
  1426  	{-Pi, Copysign(0, -1)},
  1427  	{-Pi, 0},
  1428  	{-Pi, 1},
  1429  	{-Pi, Pi},
  1430  	{-Pi, Inf(1)},
  1431  	{-Pi, NaN()},
  1432  
  1433  	{-1, Inf(-1)},
  1434  	{-1, Inf(1)},
  1435  	{-1, NaN()},
  1436  	{-1 / 2, Inf(-1)},
  1437  	{-1 / 2, Inf(1)},
  1438  	{Copysign(0, -1), Inf(-1)},
  1439  	{Copysign(0, -1), -Pi},
  1440  	{Copysign(0, -1), -3},
  1441  	{Copysign(0, -1), 3},
  1442  	{Copysign(0, -1), Pi},
  1443  	{Copysign(0, -1), Inf(1)},
  1444  
  1445  	{0, Inf(-1)},
  1446  	{0, -Pi},
  1447  	{0, -3},
  1448  	{0, Copysign(0, -1)},
  1449  	{0, 0},
  1450  	{0, 3},
  1451  	{0, Pi},
  1452  	{0, Inf(1)},
  1453  	{0, NaN()},
  1454  
  1455  	{1 / 2, Inf(-1)},
  1456  	{1 / 2, Inf(1)},
  1457  	{1, Inf(-1)},
  1458  	{1, Inf(1)},
  1459  	{1, NaN()},
  1460  
  1461  	{Pi, Inf(-1)},
  1462  	{Pi, Copysign(0, -1)},
  1463  	{Pi, 0},
  1464  	{Pi, 1},
  1465  	{Pi, Inf(1)},
  1466  	{Pi, NaN()},
  1467  	{Inf(1), -Pi},
  1468  	{Inf(1), Copysign(0, -1)},
  1469  	{Inf(1), 0},
  1470  	{Inf(1), 1},
  1471  	{Inf(1), Pi},
  1472  	{Inf(1), NaN()},
  1473  	{NaN(), -Pi},
  1474  	{NaN(), Copysign(0, -1)},
  1475  	{NaN(), 0},
  1476  	{NaN(), 1},
  1477  	{NaN(), Pi},
  1478  	{NaN(), NaN()},
  1479  }
  1480  var powSC = []float64{
  1481  	0,               // pow(-Inf, -Pi)
  1482  	Copysign(0, -1), // pow(-Inf, -3)
  1483  	1,               // pow(-Inf, -0)
  1484  	1,               // pow(-Inf, +0)
  1485  	Inf(-1),         // pow(-Inf, 1)
  1486  	Inf(-1),         // pow(-Inf, 3)
  1487  	Inf(1),          // pow(-Inf, Pi)
  1488  	NaN(),           // pow(-Inf, NaN)
  1489  	0,               // pow(-Pi, -Inf)
  1490  	NaN(),           // pow(-Pi, -Pi)
  1491  	1,               // pow(-Pi, -0)
  1492  	1,               // pow(-Pi, +0)
  1493  	-Pi,             // pow(-Pi, 1)
  1494  	NaN(),           // pow(-Pi, Pi)
  1495  	Inf(1),          // pow(-Pi, +Inf)
  1496  	NaN(),           // pow(-Pi, NaN)
  1497  	1,               // pow(-1, -Inf) IEEE 754-2008
  1498  	1,               // pow(-1, +Inf) IEEE 754-2008
  1499  	NaN(),           // pow(-1, NaN)
  1500  	Inf(1),          // pow(-1/2, -Inf)
  1501  	0,               // pow(-1/2, +Inf)
  1502  	Inf(1),          // pow(-0, -Inf)
  1503  	Inf(1),          // pow(-0, -Pi)
  1504  	Inf(-1),         // pow(-0, -3) IEEE 754-2008
  1505  	Copysign(0, -1), // pow(-0, 3) IEEE 754-2008
  1506  	0,               // pow(-0, +Pi)
  1507  	0,               // pow(-0, +Inf)
  1508  	Inf(1),          // pow(+0, -Inf)
  1509  	Inf(1),          // pow(+0, -Pi)
  1510  	Inf(1),          // pow(+0, -3)
  1511  	1,               // pow(+0, -0)
  1512  	1,               // pow(+0, +0)
  1513  	0,               // pow(+0, 3)
  1514  	0,               // pow(+0, +Pi)
  1515  	0,               // pow(+0, +Inf)
  1516  	NaN(),           // pow(+0, NaN)
  1517  	Inf(1),          // pow(1/2, -Inf)
  1518  	0,               // pow(1/2, +Inf)
  1519  	1,               // pow(1, -Inf) IEEE 754-2008
  1520  	1,               // pow(1, +Inf) IEEE 754-2008
  1521  	1,               // pow(1, NaN) IEEE 754-2008
  1522  	0,               // pow(+Pi, -Inf)
  1523  	1,               // pow(+Pi, -0)
  1524  	1,               // pow(+Pi, +0)
  1525  	Pi,              // pow(+Pi, 1)
  1526  	Inf(1),          // pow(+Pi, +Inf)
  1527  	NaN(),           // pow(+Pi, NaN)
  1528  	0,               // pow(+Inf, -Pi)
  1529  	1,               // pow(+Inf, -0)
  1530  	1,               // pow(+Inf, +0)
  1531  	Inf(1),          // pow(+Inf, 1)
  1532  	Inf(1),          // pow(+Inf, Pi)
  1533  	NaN(),           // pow(+Inf, NaN)
  1534  	NaN(),           // pow(NaN, -Pi)
  1535  	1,               // pow(NaN, -0)
  1536  	1,               // pow(NaN, +0)
  1537  	NaN(),           // pow(NaN, 1)
  1538  	NaN(),           // pow(NaN, +Pi)
  1539  	NaN(),           // pow(NaN, NaN)
  1540  }
  1541  
  1542  var vfpow10SC = []int{
  1543  	MinInt32,
  1544  	MaxInt32,
  1545  	-325,
  1546  	309,
  1547  }
  1548  
  1549  var pow10SC = []float64{
  1550  	0,      // pow10(MinInt32)
  1551  	Inf(1), // pow10(MaxInt32)
  1552  	0,      // pow10(-325)
  1553  	Inf(1), // pow10(309)
  1554  }
  1555  
  1556  var vfsignbitSC = []float64{
  1557  	Inf(-1),
  1558  	Copysign(0, -1),
  1559  	0,
  1560  	Inf(1),
  1561  	NaN(),
  1562  }
  1563  var signbitSC = []bool{
  1564  	true,
  1565  	true,
  1566  	false,
  1567  	false,
  1568  	false,
  1569  }
  1570  
  1571  var vfsinSC = []float64{
  1572  	Inf(-1),
  1573  	Copysign(0, -1),
  1574  	0,
  1575  	Inf(1),
  1576  	NaN(),
  1577  }
  1578  var sinSC = []float64{
  1579  	NaN(),
  1580  	Copysign(0, -1),
  1581  	0,
  1582  	NaN(),
  1583  	NaN(),
  1584  }
  1585  
  1586  var vfsinhSC = []float64{
  1587  	Inf(-1),
  1588  	Copysign(0, -1),
  1589  	0,
  1590  	Inf(1),
  1591  	NaN(),
  1592  }
  1593  var sinhSC = []float64{
  1594  	Inf(-1),
  1595  	Copysign(0, -1),
  1596  	0,
  1597  	Inf(1),
  1598  	NaN(),
  1599  }
  1600  
  1601  var vfsqrtSC = []float64{
  1602  	Inf(-1),
  1603  	-Pi,
  1604  	Copysign(0, -1),
  1605  	0,
  1606  	Inf(1),
  1607  	NaN(),
  1608  }
  1609  var sqrtSC = []float64{
  1610  	NaN(),
  1611  	NaN(),
  1612  	Copysign(0, -1),
  1613  	0,
  1614  	Inf(1),
  1615  	NaN(),
  1616  }
  1617  
  1618  var vftanhSC = []float64{
  1619  	Inf(-1),
  1620  	Copysign(0, -1),
  1621  	0,
  1622  	Inf(1),
  1623  	NaN(),
  1624  }
  1625  var tanhSC = []float64{
  1626  	-1,
  1627  	Copysign(0, -1),
  1628  	0,
  1629  	1,
  1630  	NaN(),
  1631  }
  1632  
  1633  var vfy0SC = []float64{
  1634  	Inf(-1),
  1635  	0,
  1636  	Inf(1),
  1637  	NaN(),
  1638  }
  1639  var y0SC = []float64{
  1640  	NaN(),
  1641  	Inf(-1),
  1642  	0,
  1643  	NaN(),
  1644  }
  1645  var y1SC = []float64{
  1646  	NaN(),
  1647  	Inf(-1),
  1648  	0,
  1649  	NaN(),
  1650  }
  1651  var y2SC = []float64{
  1652  	NaN(),
  1653  	Inf(-1),
  1654  	0,
  1655  	NaN(),
  1656  }
  1657  var yM3SC = []float64{
  1658  	NaN(),
  1659  	Inf(1),
  1660  	0,
  1661  	NaN(),
  1662  }
  1663  
  1664  // arguments and expected results for boundary cases
  1665  const (
  1666  	SmallestNormalFloat64   = 2.2250738585072014e-308 // 2**-1022
  1667  	LargestSubnormalFloat64 = SmallestNormalFloat64 - SmallestNonzeroFloat64
  1668  )
  1669  
  1670  var vffrexpBC = []float64{
  1671  	SmallestNormalFloat64,
  1672  	LargestSubnormalFloat64,
  1673  	SmallestNonzeroFloat64,
  1674  	MaxFloat64,
  1675  	-SmallestNormalFloat64,
  1676  	-LargestSubnormalFloat64,
  1677  	-SmallestNonzeroFloat64,
  1678  	-MaxFloat64,
  1679  }
  1680  var frexpBC = []fi{
  1681  	{0.5, -1021},
  1682  	{0.99999999999999978, -1022},
  1683  	{0.5, -1073},
  1684  	{0.99999999999999989, 1024},
  1685  	{-0.5, -1021},
  1686  	{-0.99999999999999978, -1022},
  1687  	{-0.5, -1073},
  1688  	{-0.99999999999999989, 1024},
  1689  }
  1690  
  1691  var vfldexpBC = []fi{
  1692  	{SmallestNormalFloat64, -52},
  1693  	{LargestSubnormalFloat64, -51},
  1694  	{SmallestNonzeroFloat64, 1074},
  1695  	{MaxFloat64, -(1023 + 1074)},
  1696  	{1, -1075},
  1697  	{-1, -1075},
  1698  	{1, 1024},
  1699  	{-1, 1024},
  1700  }
  1701  var ldexpBC = []float64{
  1702  	SmallestNonzeroFloat64,
  1703  	1e-323, // 2**-1073
  1704  	1,
  1705  	1e-323, // 2**-1073
  1706  	0,
  1707  	Copysign(0, -1),
  1708  	Inf(1),
  1709  	Inf(-1),
  1710  }
  1711  
  1712  var logbBC = []float64{
  1713  	-1022,
  1714  	-1023,
  1715  	-1074,
  1716  	1023,
  1717  	-1022,
  1718  	-1023,
  1719  	-1074,
  1720  	1023,
  1721  }
  1722  
  1723  func tolerance(a, b, e float64) bool {
  1724  	d := a - b
  1725  	if d < 0 {
  1726  		d = -d
  1727  	}
  1728  
  1729  	if a != 0 {
  1730  		e = e * a
  1731  		if e < 0 {
  1732  			e = -e
  1733  		}
  1734  	}
  1735  	return d < e
  1736  }
  1737  func kindaclose(a, b float64) bool { return tolerance(a, b, 1e-8) }
  1738  func close(a, b float64) bool      { return tolerance(a, b, 1e-14) }
  1739  func veryclose(a, b float64) bool  { return tolerance(a, b, 4e-16) }
  1740  func soclose(a, b, e float64) bool { return tolerance(a, b, e) }
  1741  func alike(a, b float64) bool {
  1742  	switch {
  1743  	case IsNaN(a) && IsNaN(b):
  1744  		return true
  1745  	case a == b:
  1746  		return Signbit(a) == Signbit(b)
  1747  	}
  1748  	return false
  1749  }
  1750  
  1751  func TestNaN(t *testing.T) {
  1752  	f64 := NaN()
  1753  	if f64 == f64 {
  1754  		t.Fatalf("NaN() returns %g, expected NaN", f64)
  1755  	}
  1756  	f32 := float32(f64)
  1757  	if f32 == f32 {
  1758  		t.Fatalf("float32(NaN()) is %g, expected NaN", f32)
  1759  	}
  1760  }
  1761  
  1762  func TestAcos(t *testing.T) {
  1763  	for i := 0; i < len(vf); i++ {
  1764  		a := vf[i] / 10
  1765  		if f := Acos(a); !close(acos[i], f) {
  1766  			t.Errorf("Acos(%g) = %g, want %g", a, f, acos[i])
  1767  		}
  1768  	}
  1769  	for i := 0; i < len(vfacosSC); i++ {
  1770  		if f := Acos(vfacosSC[i]); !alike(acosSC[i], f) {
  1771  			t.Errorf("Acos(%g) = %g, want %g", vfacosSC[i], f, acosSC[i])
  1772  		}
  1773  	}
  1774  }
  1775  
  1776  func TestAcosh(t *testing.T) {
  1777  	for i := 0; i < len(vf); i++ {
  1778  		a := 1 + Abs(vf[i])
  1779  		if f := Acosh(a); !veryclose(acosh[i], f) {
  1780  			t.Errorf("Acosh(%g) = %g, want %g", a, f, acosh[i])
  1781  		}
  1782  	}
  1783  	for i := 0; i < len(vfacoshSC); i++ {
  1784  		if f := Acosh(vfacoshSC[i]); !alike(acoshSC[i], f) {
  1785  			t.Errorf("Acosh(%g) = %g, want %g", vfacoshSC[i], f, acoshSC[i])
  1786  		}
  1787  	}
  1788  }
  1789  
  1790  func TestAsin(t *testing.T) {
  1791  	for i := 0; i < len(vf); i++ {
  1792  		a := vf[i] / 10
  1793  		if f := Asin(a); !veryclose(asin[i], f) {
  1794  			t.Errorf("Asin(%g) = %g, want %g", a, f, asin[i])
  1795  		}
  1796  	}
  1797  	for i := 0; i < len(vfasinSC); i++ {
  1798  		if f := Asin(vfasinSC[i]); !alike(asinSC[i], f) {
  1799  			t.Errorf("Asin(%g) = %g, want %g", vfasinSC[i], f, asinSC[i])
  1800  		}
  1801  	}
  1802  }
  1803  
  1804  func TestAsinh(t *testing.T) {
  1805  	for i := 0; i < len(vf); i++ {
  1806  		if f := Asinh(vf[i]); !veryclose(asinh[i], f) {
  1807  			t.Errorf("Asinh(%g) = %g, want %g", vf[i], f, asinh[i])
  1808  		}
  1809  	}
  1810  	for i := 0; i < len(vfasinhSC); i++ {
  1811  		if f := Asinh(vfasinhSC[i]); !alike(asinhSC[i], f) {
  1812  			t.Errorf("Asinh(%g) = %g, want %g", vfasinhSC[i], f, asinhSC[i])
  1813  		}
  1814  	}
  1815  }
  1816  
  1817  func TestAtan(t *testing.T) {
  1818  	for i := 0; i < len(vf); i++ {
  1819  		if f := Atan(vf[i]); !veryclose(atan[i], f) {
  1820  			t.Errorf("Atan(%g) = %g, want %g", vf[i], f, atan[i])
  1821  		}
  1822  	}
  1823  	for i := 0; i < len(vfatanSC); i++ {
  1824  		if f := Atan(vfatanSC[i]); !alike(atanSC[i], f) {
  1825  			t.Errorf("Atan(%g) = %g, want %g", vfatanSC[i], f, atanSC[i])
  1826  		}
  1827  	}
  1828  }
  1829  
  1830  func TestAtanh(t *testing.T) {
  1831  	for i := 0; i < len(vf); i++ {
  1832  		a := vf[i] / 10
  1833  		if f := Atanh(a); !veryclose(atanh[i], f) {
  1834  			t.Errorf("Atanh(%g) = %g, want %g", a, f, atanh[i])
  1835  		}
  1836  	}
  1837  	for i := 0; i < len(vfatanhSC); i++ {
  1838  		if f := Atanh(vfatanhSC[i]); !alike(atanhSC[i], f) {
  1839  			t.Errorf("Atanh(%g) = %g, want %g", vfatanhSC[i], f, atanhSC[i])
  1840  		}
  1841  	}
  1842  }
  1843  
  1844  func TestAtan2(t *testing.T) {
  1845  	for i := 0; i < len(vf); i++ {
  1846  		if f := Atan2(10, vf[i]); !veryclose(atan2[i], f) {
  1847  			t.Errorf("Atan2(10, %g) = %g, want %g", vf[i], f, atan2[i])
  1848  		}
  1849  	}
  1850  	for i := 0; i < len(vfatan2SC); i++ {
  1851  		if f := Atan2(vfatan2SC[i][0], vfatan2SC[i][1]); !alike(atan2SC[i], f) {
  1852  			t.Errorf("Atan2(%g, %g) = %g, want %g", vfatan2SC[i][0], vfatan2SC[i][1], f, atan2SC[i])
  1853  		}
  1854  	}
  1855  }
  1856  
  1857  func TestCbrt(t *testing.T) {
  1858  	for i := 0; i < len(vf); i++ {
  1859  		if f := Cbrt(vf[i]); !veryclose(cbrt[i], f) {
  1860  			t.Errorf("Cbrt(%g) = %g, want %g", vf[i], f, cbrt[i])
  1861  		}
  1862  	}
  1863  	for i := 0; i < len(vfcbrtSC); i++ {
  1864  		if f := Cbrt(vfcbrtSC[i]); !alike(cbrtSC[i], f) {
  1865  			t.Errorf("Cbrt(%g) = %g, want %g", vfcbrtSC[i], f, cbrtSC[i])
  1866  		}
  1867  	}
  1868  }
  1869  
  1870  func TestCeil(t *testing.T) {
  1871  	for i := 0; i < len(vf); i++ {
  1872  		if f := Ceil(vf[i]); ceil[i] != f {
  1873  			t.Errorf("Ceil(%g) = %g, want %g", vf[i], f, ceil[i])
  1874  		}
  1875  	}
  1876  	for i := 0; i < len(vfceilSC); i++ {
  1877  		if f := Ceil(vfceilSC[i]); !alike(ceilSC[i], f) {
  1878  			t.Errorf("Ceil(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i])
  1879  		}
  1880  	}
  1881  }
  1882  
  1883  func TestCopysign(t *testing.T) {
  1884  	for i := 0; i < len(vf); i++ {
  1885  		if f := Copysign(vf[i], -1); copysign[i] != f {
  1886  			t.Errorf("Copysign(%g, -1) = %g, want %g", vf[i], f, copysign[i])
  1887  		}
  1888  	}
  1889  	for i := 0; i < len(vf); i++ {
  1890  		if f := Copysign(vf[i], 1); -copysign[i] != f {
  1891  			t.Errorf("Copysign(%g, 1) = %g, want %g", vf[i], f, -copysign[i])
  1892  		}
  1893  	}
  1894  	for i := 0; i < len(vfcopysignSC); i++ {
  1895  		if f := Copysign(vfcopysignSC[i], -1); !alike(copysignSC[i], f) {
  1896  			t.Errorf("Copysign(%g, -1) = %g, want %g", vfcopysignSC[i], f, copysignSC[i])
  1897  		}
  1898  	}
  1899  }
  1900  
  1901  func TestCos(t *testing.T) {
  1902  	for i := 0; i < len(vf); i++ {
  1903  		if f := Cos(vf[i]); !veryclose(cos[i], f) {
  1904  			t.Errorf("Cos(%g) = %g, want %g", vf[i], f, cos[i])
  1905  		}
  1906  	}
  1907  	for i := 0; i < len(vfcosSC); i++ {
  1908  		if f := Cos(vfcosSC[i]); !alike(cosSC[i], f) {
  1909  			t.Errorf("Cos(%g) = %g, want %g", vfcosSC[i], f, cosSC[i])
  1910  		}
  1911  	}
  1912  }
  1913  
  1914  func TestCosh(t *testing.T) {
  1915  	for i := 0; i < len(vf); i++ {
  1916  		if f := Cosh(vf[i]); !close(cosh[i], f) {
  1917  			t.Errorf("Cosh(%g) = %g, want %g", vf[i], f, cosh[i])
  1918  		}
  1919  	}
  1920  	for i := 0; i < len(vfcoshSC); i++ {
  1921  		if f := Cosh(vfcoshSC[i]); !alike(coshSC[i], f) {
  1922  			t.Errorf("Cosh(%g) = %g, want %g", vfcoshSC[i], f, coshSC[i])
  1923  		}
  1924  	}
  1925  }
  1926  
  1927  func TestErf(t *testing.T) {
  1928  	for i := 0; i < len(vf); i++ {
  1929  		a := vf[i] / 10
  1930  		if f := Erf(a); !veryclose(erf[i], f) {
  1931  			t.Errorf("Erf(%g) = %g, want %g", a, f, erf[i])
  1932  		}
  1933  	}
  1934  	for i := 0; i < len(vferfSC); i++ {
  1935  		if f := Erf(vferfSC[i]); !alike(erfSC[i], f) {
  1936  			t.Errorf("Erf(%g) = %g, want %g", vferfSC[i], f, erfSC[i])
  1937  		}
  1938  	}
  1939  }
  1940  
  1941  func TestErfc(t *testing.T) {
  1942  	for i := 0; i < len(vf); i++ {
  1943  		a := vf[i] / 10
  1944  		if f := Erfc(a); !veryclose(erfc[i], f) {
  1945  			t.Errorf("Erfc(%g) = %g, want %g", a, f, erfc[i])
  1946  		}
  1947  	}
  1948  	for i := 0; i < len(vferfcSC); i++ {
  1949  		if f := Erfc(vferfcSC[i]); !alike(erfcSC[i], f) {
  1950  			t.Errorf("Erfc(%g) = %g, want %g", vferfcSC[i], f, erfcSC[i])
  1951  		}
  1952  	}
  1953  }
  1954  
  1955  func TestExp(t *testing.T) {
  1956  	testExp(t, Exp, "Exp")
  1957  	testExp(t, ExpGo, "ExpGo")
  1958  }
  1959  
  1960  func testExp(t *testing.T, Exp func(float64) float64, name string) {
  1961  	for i := 0; i < len(vf); i++ {
  1962  		if f := Exp(vf[i]); !close(exp[i], f) {
  1963  			t.Errorf("%s(%g) = %g, want %g", name, vf[i], f, exp[i])
  1964  		}
  1965  	}
  1966  	for i := 0; i < len(vfexpSC); i++ {
  1967  		if f := Exp(vfexpSC[i]); !alike(expSC[i], f) {
  1968  			t.Errorf("%s(%g) = %g, want %g", name, vfexpSC[i], f, expSC[i])
  1969  		}
  1970  	}
  1971  }
  1972  
  1973  func TestExpm1(t *testing.T) {
  1974  	for i := 0; i < len(vf); i++ {
  1975  		a := vf[i] / 100
  1976  		if f := Expm1(a); !veryclose(expm1[i], f) {
  1977  			t.Errorf("Expm1(%g) = %g, want %g", a, f, expm1[i])
  1978  		}
  1979  	}
  1980  	for i := 0; i < len(vfexpm1SC); i++ {
  1981  		if f := Expm1(vfexpm1SC[i]); !alike(expm1SC[i], f) {
  1982  			t.Errorf("Expm1(%g) = %g, want %g", vfexpm1SC[i], f, expm1SC[i])
  1983  		}
  1984  	}
  1985  }
  1986  
  1987  func TestExp2(t *testing.T) {
  1988  	testExp2(t, Exp2, "Exp2")
  1989  	testExp2(t, Exp2Go, "Exp2Go")
  1990  }
  1991  
  1992  func testExp2(t *testing.T, Exp2 func(float64) float64, name string) {
  1993  	for i := 0; i < len(vf); i++ {
  1994  		if f := Exp2(vf[i]); !close(exp2[i], f) {
  1995  			t.Errorf("%s(%g) = %g, want %g", name, vf[i], f, exp2[i])
  1996  		}
  1997  	}
  1998  	for i := 0; i < len(vfexpSC); i++ {
  1999  		if f := Exp2(vfexpSC[i]); !alike(expSC[i], f) {
  2000  			t.Errorf("%s(%g) = %g, want %g", name, vfexpSC[i], f, expSC[i])
  2001  		}
  2002  	}
  2003  	for n := -1074; n < 1024; n++ {
  2004  		f := Exp2(float64(n))
  2005  		vf := Ldexp(1, n)
  2006  		if f != vf {
  2007  			t.Errorf("%s(%d) = %g, want %g", name, n, f, vf)
  2008  		}
  2009  	}
  2010  }
  2011  
  2012  func TestAbs(t *testing.T) {
  2013  	for i := 0; i < len(vf); i++ {
  2014  		if f := Abs(vf[i]); fabs[i] != f {
  2015  			t.Errorf("Abs(%g) = %g, want %g", vf[i], f, fabs[i])
  2016  		}
  2017  	}
  2018  	for i := 0; i < len(vffabsSC); i++ {
  2019  		if f := Abs(vffabsSC[i]); !alike(fabsSC[i], f) {
  2020  			t.Errorf("Abs(%g) = %g, want %g", vffabsSC[i], f, fabsSC[i])
  2021  		}
  2022  	}
  2023  }
  2024  
  2025  func TestDim(t *testing.T) {
  2026  	for i := 0; i < len(vf); i++ {
  2027  		if f := Dim(vf[i], 0); fdim[i] != f {
  2028  			t.Errorf("Dim(%g, %g) = %g, want %g", vf[i], 0.0, f, fdim[i])
  2029  		}
  2030  	}
  2031  	for i := 0; i < len(vffdimSC); i++ {
  2032  		if f := Dim(vffdimSC[i][0], vffdimSC[i][1]); !alike(fdimSC[i], f) {
  2033  			t.Errorf("Dim(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fdimSC[i])
  2034  		}
  2035  	}
  2036  	for i := 0; i < len(vffdim2SC); i++ {
  2037  		if f := Dim(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fdimSC[i], f) {
  2038  			t.Errorf("Dim(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fdimSC[i])
  2039  		}
  2040  	}
  2041  }
  2042  
  2043  func TestFloor(t *testing.T) {
  2044  	for i := 0; i < len(vf); i++ {
  2045  		if f := Floor(vf[i]); floor[i] != f {
  2046  			t.Errorf("Floor(%g) = %g, want %g", vf[i], f, floor[i])
  2047  		}
  2048  	}
  2049  	for i := 0; i < len(vfceilSC); i++ {
  2050  		if f := Floor(vfceilSC[i]); !alike(ceilSC[i], f) {
  2051  			t.Errorf("Floor(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i])
  2052  		}
  2053  	}
  2054  }
  2055  
  2056  func TestMax(t *testing.T) {
  2057  	for i := 0; i < len(vf); i++ {
  2058  		if f := Max(vf[i], ceil[i]); ceil[i] != f {
  2059  			t.Errorf("Max(%g, %g) = %g, want %g", vf[i], ceil[i], f, ceil[i])
  2060  		}
  2061  	}
  2062  	for i := 0; i < len(vffdimSC); i++ {
  2063  		if f := Max(vffdimSC[i][0], vffdimSC[i][1]); !alike(fmaxSC[i], f) {
  2064  			t.Errorf("Max(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fmaxSC[i])
  2065  		}
  2066  	}
  2067  	for i := 0; i < len(vffdim2SC); i++ {
  2068  		if f := Max(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fmaxSC[i], f) {
  2069  			t.Errorf("Max(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fmaxSC[i])
  2070  		}
  2071  	}
  2072  }
  2073  
  2074  func TestMin(t *testing.T) {
  2075  	for i := 0; i < len(vf); i++ {
  2076  		if f := Min(vf[i], floor[i]); floor[i] != f {
  2077  			t.Errorf("Min(%g, %g) = %g, want %g", vf[i], floor[i], f, floor[i])
  2078  		}
  2079  	}
  2080  	for i := 0; i < len(vffdimSC); i++ {
  2081  		if f := Min(vffdimSC[i][0], vffdimSC[i][1]); !alike(fminSC[i], f) {
  2082  			t.Errorf("Min(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fminSC[i])
  2083  		}
  2084  	}
  2085  	for i := 0; i < len(vffdim2SC); i++ {
  2086  		if f := Min(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fminSC[i], f) {
  2087  			t.Errorf("Min(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fminSC[i])
  2088  		}
  2089  	}
  2090  }
  2091  
  2092  func TestMod(t *testing.T) {
  2093  	for i := 0; i < len(vf); i++ {
  2094  		if f := Mod(10, vf[i]); fmod[i] != f {
  2095  			t.Errorf("Mod(10, %g) = %g, want %g", vf[i], f, fmod[i])
  2096  		}
  2097  	}
  2098  	for i := 0; i < len(vffmodSC); i++ {
  2099  		if f := Mod(vffmodSC[i][0], vffmodSC[i][1]); !alike(fmodSC[i], f) {
  2100  			t.Errorf("Mod(%g, %g) = %g, want %g", vffmodSC[i][0], vffmodSC[i][1], f, fmodSC[i])
  2101  		}
  2102  	}
  2103  }
  2104  
  2105  func TestFrexp(t *testing.T) {
  2106  	for i := 0; i < len(vf); i++ {
  2107  		if f, j := Frexp(vf[i]); !veryclose(frexp[i].f, f) || frexp[i].i != j {
  2108  			t.Errorf("Frexp(%g) = %g, %d, want %g, %d", vf[i], f, j, frexp[i].f, frexp[i].i)
  2109  		}
  2110  	}
  2111  	for i := 0; i < len(vffrexpSC); i++ {
  2112  		if f, j := Frexp(vffrexpSC[i]); !alike(frexpSC[i].f, f) || frexpSC[i].i != j {
  2113  			t.Errorf("Frexp(%g) = %g, %d, want %g, %d", vffrexpSC[i], f, j, frexpSC[i].f, frexpSC[i].i)
  2114  		}
  2115  	}
  2116  	for i := 0; i < len(vffrexpBC); i++ {
  2117  		if f, j := Frexp(vffrexpBC[i]); !alike(frexpBC[i].f, f) || frexpBC[i].i != j {
  2118  			t.Errorf("Frexp(%g) = %g, %d, want %g, %d", vffrexpBC[i], f, j, frexpBC[i].f, frexpBC[i].i)
  2119  		}
  2120  	}
  2121  }
  2122  
  2123  func TestGamma(t *testing.T) {
  2124  	for i := 0; i < len(vf); i++ {
  2125  		if f := Gamma(vf[i]); !close(gamma[i], f) {
  2126  			t.Errorf("Gamma(%g) = %g, want %g", vf[i], f, gamma[i])
  2127  		}
  2128  	}
  2129  	for i := 0; i < len(vfgammaSC); i++ {
  2130  		if f := Gamma(vfgammaSC[i]); !alike(gammaSC[i], f) {
  2131  			t.Errorf("Gamma(%g) = %g, want %g", vfgammaSC[i], f, gammaSC[i])
  2132  		}
  2133  	}
  2134  }
  2135  
  2136  func TestHypot(t *testing.T) {
  2137  	for i := 0; i < len(vf); i++ {
  2138  		a := Abs(1e200 * tanh[i] * Sqrt(2))
  2139  		if f := Hypot(1e200*tanh[i], 1e200*tanh[i]); !veryclose(a, f) {
  2140  			t.Errorf("Hypot(%g, %g) = %g, want %g", 1e200*tanh[i], 1e200*tanh[i], f, a)
  2141  		}
  2142  	}
  2143  	for i := 0; i < len(vfhypotSC); i++ {
  2144  		if f := Hypot(vfhypotSC[i][0], vfhypotSC[i][1]); !alike(hypotSC[i], f) {
  2145  			t.Errorf("Hypot(%g, %g) = %g, want %g", vfhypotSC[i][0], vfhypotSC[i][1], f, hypotSC[i])
  2146  		}
  2147  	}
  2148  }
  2149  
  2150  func TestHypotGo(t *testing.T) {
  2151  	for i := 0; i < len(vf); i++ {
  2152  		a := Abs(1e200 * tanh[i] * Sqrt(2))
  2153  		if f := HypotGo(1e200*tanh[i], 1e200*tanh[i]); !veryclose(a, f) {
  2154  			t.Errorf("HypotGo(%g, %g) = %g, want %g", 1e200*tanh[i], 1e200*tanh[i], f, a)
  2155  		}
  2156  	}
  2157  	for i := 0; i < len(vfhypotSC); i++ {
  2158  		if f := HypotGo(vfhypotSC[i][0], vfhypotSC[i][1]); !alike(hypotSC[i], f) {
  2159  			t.Errorf("HypotGo(%g, %g) = %g, want %g", vfhypotSC[i][0], vfhypotSC[i][1], f, hypotSC[i])
  2160  		}
  2161  	}
  2162  }
  2163  
  2164  func TestIlogb(t *testing.T) {
  2165  	for i := 0; i < len(vf); i++ {
  2166  		a := frexp[i].i - 1 // adjust because fr in the interval [½, 1)
  2167  		if e := Ilogb(vf[i]); a != e {
  2168  			t.Errorf("Ilogb(%g) = %d, want %d", vf[i], e, a)
  2169  		}
  2170  	}
  2171  	for i := 0; i < len(vflogbSC); i++ {
  2172  		if e := Ilogb(vflogbSC[i]); ilogbSC[i] != e {
  2173  			t.Errorf("Ilogb(%g) = %d, want %d", vflogbSC[i], e, ilogbSC[i])
  2174  		}
  2175  	}
  2176  	for i := 0; i < len(vffrexpBC); i++ {
  2177  		if e := Ilogb(vffrexpBC[i]); int(logbBC[i]) != e {
  2178  			t.Errorf("Ilogb(%g) = %d, want %d", vffrexpBC[i], e, int(logbBC[i]))
  2179  		}
  2180  	}
  2181  }
  2182  
  2183  func TestJ0(t *testing.T) {
  2184  	for i := 0; i < len(vf); i++ {
  2185  		if f := J0(vf[i]); !soclose(j0[i], f, 4e-14) {
  2186  			t.Errorf("J0(%g) = %g, want %g", vf[i], f, j0[i])
  2187  		}
  2188  	}
  2189  	for i := 0; i < len(vfj0SC); i++ {
  2190  		if f := J0(vfj0SC[i]); !alike(j0SC[i], f) {
  2191  			t.Errorf("J0(%g) = %g, want %g", vfj0SC[i], f, j0SC[i])
  2192  		}
  2193  	}
  2194  }
  2195  
  2196  func TestJ1(t *testing.T) {
  2197  	for i := 0; i < len(vf); i++ {
  2198  		if f := J1(vf[i]); !close(j1[i], f) {
  2199  			t.Errorf("J1(%g) = %g, want %g", vf[i], f, j1[i])
  2200  		}
  2201  	}
  2202  	for i := 0; i < len(vfj0SC); i++ {
  2203  		if f := J1(vfj0SC[i]); !alike(j1SC[i], f) {
  2204  			t.Errorf("J1(%g) = %g, want %g", vfj0SC[i], f, j1SC[i])
  2205  		}
  2206  	}
  2207  }
  2208  
  2209  func TestJn(t *testing.T) {
  2210  	for i := 0; i < len(vf); i++ {
  2211  		if f := Jn(2, vf[i]); !close(j2[i], f) {
  2212  			t.Errorf("Jn(2, %g) = %g, want %g", vf[i], f, j2[i])
  2213  		}
  2214  		if f := Jn(-3, vf[i]); !close(jM3[i], f) {
  2215  			t.Errorf("Jn(-3, %g) = %g, want %g", vf[i], f, jM3[i])
  2216  		}
  2217  	}
  2218  	for i := 0; i < len(vfj0SC); i++ {
  2219  		if f := Jn(2, vfj0SC[i]); !alike(j2SC[i], f) {
  2220  			t.Errorf("Jn(2, %g) = %g, want %g", vfj0SC[i], f, j2SC[i])
  2221  		}
  2222  		if f := Jn(-3, vfj0SC[i]); !alike(jM3SC[i], f) {
  2223  			t.Errorf("Jn(-3, %g) = %g, want %g", vfj0SC[i], f, jM3SC[i])
  2224  		}
  2225  	}
  2226  }
  2227  
  2228  func TestLdexp(t *testing.T) {
  2229  	for i := 0; i < len(vf); i++ {
  2230  		if f := Ldexp(frexp[i].f, frexp[i].i); !veryclose(vf[i], f) {
  2231  			t.Errorf("Ldexp(%g, %d) = %g, want %g", frexp[i].f, frexp[i].i, f, vf[i])
  2232  		}
  2233  	}
  2234  	for i := 0; i < len(vffrexpSC); i++ {
  2235  		if f := Ldexp(frexpSC[i].f, frexpSC[i].i); !alike(vffrexpSC[i], f) {
  2236  			t.Errorf("Ldexp(%g, %d) = %g, want %g", frexpSC[i].f, frexpSC[i].i, f, vffrexpSC[i])
  2237  		}
  2238  	}
  2239  	for i := 0; i < len(vfldexpSC); i++ {
  2240  		if f := Ldexp(vfldexpSC[i].f, vfldexpSC[i].i); !alike(ldexpSC[i], f) {
  2241  			t.Errorf("Ldexp(%g, %d) = %g, want %g", vfldexpSC[i].f, vfldexpSC[i].i, f, ldexpSC[i])
  2242  		}
  2243  	}
  2244  	for i := 0; i < len(vffrexpBC); i++ {
  2245  		if f := Ldexp(frexpBC[i].f, frexpBC[i].i); !alike(vffrexpBC[i], f) {
  2246  			t.Errorf("Ldexp(%g, %d) = %g, want %g", frexpBC[i].f, frexpBC[i].i, f, vffrexpBC[i])
  2247  		}
  2248  	}
  2249  	for i := 0; i < len(vfldexpBC); i++ {
  2250  		if f := Ldexp(vfldexpBC[i].f, vfldexpBC[i].i); !alike(ldexpBC[i], f) {
  2251  			t.Errorf("Ldexp(%g, %d) = %g, want %g", vfldexpBC[i].f, vfldexpBC[i].i, f, ldexpBC[i])
  2252  		}
  2253  	}
  2254  }
  2255  
  2256  func TestLgamma(t *testing.T) {
  2257  	for i := 0; i < len(vf); i++ {
  2258  		if f, s := Lgamma(vf[i]); !close(lgamma[i].f, f) || lgamma[i].i != s {
  2259  			t.Errorf("Lgamma(%g) = %g, %d, want %g, %d", vf[i], f, s, lgamma[i].f, lgamma[i].i)
  2260  		}
  2261  	}
  2262  	for i := 0; i < len(vflgammaSC); i++ {
  2263  		if f, s := Lgamma(vflgammaSC[i]); !alike(lgammaSC[i].f, f) || lgammaSC[i].i != s {
  2264  			t.Errorf("Lgamma(%g) = %g, %d, want %g, %d", vflgammaSC[i], f, s, lgammaSC[i].f, lgammaSC[i].i)
  2265  		}
  2266  	}
  2267  }
  2268  
  2269  func TestLog(t *testing.T) {
  2270  	for i := 0; i < len(vf); i++ {
  2271  		a := Abs(vf[i])
  2272  		if f := Log(a); log[i] != f {
  2273  			t.Errorf("Log(%g) = %g, want %g", a, f, log[i])
  2274  		}
  2275  	}
  2276  	if f := Log(10); f != Ln10 {
  2277  		t.Errorf("Log(%g) = %g, want %g", 10.0, f, Ln10)
  2278  	}
  2279  	for i := 0; i < len(vflogSC); i++ {
  2280  		if f := Log(vflogSC[i]); !alike(logSC[i], f) {
  2281  			t.Errorf("Log(%g) = %g, want %g", vflogSC[i], f, logSC[i])
  2282  		}
  2283  	}
  2284  }
  2285  
  2286  func TestLogb(t *testing.T) {
  2287  	for i := 0; i < len(vf); i++ {
  2288  		if f := Logb(vf[i]); logb[i] != f {
  2289  			t.Errorf("Logb(%g) = %g, want %g", vf[i], f, logb[i])
  2290  		}
  2291  	}
  2292  	for i := 0; i < len(vflogbSC); i++ {
  2293  		if f := Logb(vflogbSC[i]); !alike(logbSC[i], f) {
  2294  			t.Errorf("Logb(%g) = %g, want %g", vflogbSC[i], f, logbSC[i])
  2295  		}
  2296  	}
  2297  	for i := 0; i < len(vffrexpBC); i++ {
  2298  		if f := Logb(vffrexpBC[i]); !alike(logbBC[i], f) {
  2299  			t.Errorf("Logb(%g) = %g, want %g", vffrexpBC[i], f, logbBC[i])
  2300  		}
  2301  	}
  2302  }
  2303  
  2304  func TestLog10(t *testing.T) {
  2305  	for i := 0; i < len(vf); i++ {
  2306  		a := Abs(vf[i])
  2307  		if f := Log10(a); !veryclose(log10[i], f) {
  2308  			t.Errorf("Log10(%g) = %g, want %g", a, f, log10[i])
  2309  		}
  2310  	}
  2311  	if f := Log10(E); f != Log10E {
  2312  		t.Errorf("Log10(%g) = %g, want %g", E, f, Log10E)
  2313  	}
  2314  	for i := 0; i < len(vflogSC); i++ {
  2315  		if f := Log10(vflogSC[i]); !alike(logSC[i], f) {
  2316  			t.Errorf("Log10(%g) = %g, want %g", vflogSC[i], f, logSC[i])
  2317  		}
  2318  	}
  2319  }
  2320  
  2321  func TestLog1p(t *testing.T) {
  2322  	for i := 0; i < len(vf); i++ {
  2323  		a := vf[i] / 100
  2324  		if f := Log1p(a); !veryclose(log1p[i], f) {
  2325  			t.Errorf("Log1p(%g) = %g, want %g", a, f, log1p[i])
  2326  		}
  2327  	}
  2328  	a := 9.0
  2329  	if f := Log1p(a); f != Ln10 {
  2330  		t.Errorf("Log1p(%g) = %g, want %g", a, f, Ln10)
  2331  	}
  2332  	for i := 0; i < len(vflogSC); i++ {
  2333  		if f := Log1p(vflog1pSC[i]); !alike(log1pSC[i], f) {
  2334  			t.Errorf("Log1p(%g) = %g, want %g", vflog1pSC[i], f, log1pSC[i])
  2335  		}
  2336  	}
  2337  }
  2338  
  2339  func TestLog2(t *testing.T) {
  2340  	for i := 0; i < len(vf); i++ {
  2341  		a := Abs(vf[i])
  2342  		if f := Log2(a); !veryclose(log2[i], f) {
  2343  			t.Errorf("Log2(%g) = %g, want %g", a, f, log2[i])
  2344  		}
  2345  	}
  2346  	if f := Log2(E); f != Log2E {
  2347  		t.Errorf("Log2(%g) = %g, want %g", E, f, Log2E)
  2348  	}
  2349  	for i := 0; i < len(vflogSC); i++ {
  2350  		if f := Log2(vflogSC[i]); !alike(logSC[i], f) {
  2351  			t.Errorf("Log2(%g) = %g, want %g", vflogSC[i], f, logSC[i])
  2352  		}
  2353  	}
  2354  	for i := -1074; i <= 1023; i++ {
  2355  		f := Ldexp(1, i)
  2356  		l := Log2(f)
  2357  		if l != float64(i) {
  2358  			t.Errorf("Log2(2**%d) = %g, want %d", i, l, i)
  2359  		}
  2360  	}
  2361  }
  2362  
  2363  func TestModf(t *testing.T) {
  2364  	for i := 0; i < len(vf); i++ {
  2365  		if f, g := Modf(vf[i]); !veryclose(modf[i][0], f) || !veryclose(modf[i][1], g) {
  2366  			t.Errorf("Modf(%g) = %g, %g, want %g, %g", vf[i], f, g, modf[i][0], modf[i][1])
  2367  		}
  2368  	}
  2369  	for i := 0; i < len(vfmodfSC); i++ {
  2370  		if f, g := Modf(vfmodfSC[i]); !alike(modfSC[i][0], f) || !alike(modfSC[i][1], g) {
  2371  			t.Errorf("Modf(%g) = %g, %g, want %g, %g", vfmodfSC[i], f, g, modfSC[i][0], modfSC[i][1])
  2372  		}
  2373  	}
  2374  }
  2375  
  2376  func TestNextafter32(t *testing.T) {
  2377  	for i := 0; i < len(vf); i++ {
  2378  		vfi := float32(vf[i])
  2379  		if f := Nextafter32(vfi, 10); nextafter32[i] != f {
  2380  			t.Errorf("Nextafter32(%g, %g) = %g want %g", vfi, 10.0, f, nextafter32[i])
  2381  		}
  2382  	}
  2383  	for i := 0; i < len(vfnextafter32SC); i++ {
  2384  		if f := Nextafter32(vfnextafter32SC[i][0], vfnextafter32SC[i][1]); !alike(float64(nextafter32SC[i]), float64(f)) {
  2385  			t.Errorf("Nextafter32(%g, %g) = %g want %g", vfnextafter32SC[i][0], vfnextafter32SC[i][1], f, nextafter32SC[i])
  2386  		}
  2387  	}
  2388  }
  2389  
  2390  func TestNextafter64(t *testing.T) {
  2391  	for i := 0; i < len(vf); i++ {
  2392  		if f := Nextafter(vf[i], 10); nextafter64[i] != f {
  2393  			t.Errorf("Nextafter64(%g, %g) = %g want %g", vf[i], 10.0, f, nextafter64[i])
  2394  		}
  2395  	}
  2396  	for i := 0; i < len(vfnextafter64SC); i++ {
  2397  		if f := Nextafter(vfnextafter64SC[i][0], vfnextafter64SC[i][1]); !alike(nextafter64SC[i], f) {
  2398  			t.Errorf("Nextafter64(%g, %g) = %g want %g", vfnextafter64SC[i][0], vfnextafter64SC[i][1], f, nextafter64SC[i])
  2399  		}
  2400  	}
  2401  }
  2402  
  2403  func TestPow(t *testing.T) {
  2404  	for i := 0; i < len(vf); i++ {
  2405  		if f := Pow(10, vf[i]); !close(pow[i], f) {
  2406  			t.Errorf("Pow(10, %g) = %g, want %g", vf[i], f, pow[i])
  2407  		}
  2408  	}
  2409  	for i := 0; i < len(vfpowSC); i++ {
  2410  		if f := Pow(vfpowSC[i][0], vfpowSC[i][1]); !alike(powSC[i], f) {
  2411  			t.Errorf("Pow(%g, %g) = %g, want %g", vfpowSC[i][0], vfpowSC[i][1], f, powSC[i])
  2412  		}
  2413  	}
  2414  }
  2415  
  2416  func TestPow10(t *testing.T) {
  2417  	for i := 0; i < len(vfpow10SC); i++ {
  2418  		if f := Pow10(vfpow10SC[i]); !alike(pow10SC[i], f) {
  2419  			t.Errorf("Pow10(%d) = %g, want %g", vfpow10SC[i], f, pow10SC[i])
  2420  		}
  2421  	}
  2422  }
  2423  
  2424  func TestRemainder(t *testing.T) {
  2425  	for i := 0; i < len(vf); i++ {
  2426  		if f := Remainder(10, vf[i]); remainder[i] != f {
  2427  			t.Errorf("Remainder(10, %g) = %g, want %g", vf[i], f, remainder[i])
  2428  		}
  2429  	}
  2430  	for i := 0; i < len(vffmodSC); i++ {
  2431  		if f := Remainder(vffmodSC[i][0], vffmodSC[i][1]); !alike(fmodSC[i], f) {
  2432  			t.Errorf("Remainder(%g, %g) = %g, want %g", vffmodSC[i][0], vffmodSC[i][1], f, fmodSC[i])
  2433  		}
  2434  	}
  2435  }
  2436  
  2437  func TestSignbit(t *testing.T) {
  2438  	for i := 0; i < len(vf); i++ {
  2439  		if f := Signbit(vf[i]); signbit[i] != f {
  2440  			t.Errorf("Signbit(%g) = %t, want %t", vf[i], f, signbit[i])
  2441  		}
  2442  	}
  2443  	for i := 0; i < len(vfsignbitSC); i++ {
  2444  		if f := Signbit(vfsignbitSC[i]); signbitSC[i] != f {
  2445  			t.Errorf("Signbit(%g) = %t, want %t", vfsignbitSC[i], f, signbitSC[i])
  2446  		}
  2447  	}
  2448  }
  2449  func TestSin(t *testing.T) {
  2450  	for i := 0; i < len(vf); i++ {
  2451  		if f := Sin(vf[i]); !veryclose(sin[i], f) {
  2452  			t.Errorf("Sin(%g) = %g, want %g", vf[i], f, sin[i])
  2453  		}
  2454  	}
  2455  	for i := 0; i < len(vfsinSC); i++ {
  2456  		if f := Sin(vfsinSC[i]); !alike(sinSC[i], f) {
  2457  			t.Errorf("Sin(%g) = %g, want %g", vfsinSC[i], f, sinSC[i])
  2458  		}
  2459  	}
  2460  }
  2461  
  2462  func TestSincos(t *testing.T) {
  2463  	for i := 0; i < len(vf); i++ {
  2464  		if s, c := Sincos(vf[i]); !veryclose(sin[i], s) || !veryclose(cos[i], c) {
  2465  			t.Errorf("Sincos(%g) = %g, %g want %g, %g", vf[i], s, c, sin[i], cos[i])
  2466  		}
  2467  	}
  2468  }
  2469  
  2470  func TestSinh(t *testing.T) {
  2471  	for i := 0; i < len(vf); i++ {
  2472  		if f := Sinh(vf[i]); !close(sinh[i], f) {
  2473  			t.Errorf("Sinh(%g) = %g, want %g", vf[i], f, sinh[i])
  2474  		}
  2475  	}
  2476  	for i := 0; i < len(vfsinhSC); i++ {
  2477  		if f := Sinh(vfsinhSC[i]); !alike(sinhSC[i], f) {
  2478  			t.Errorf("Sinh(%g) = %g, want %g", vfsinhSC[i], f, sinhSC[i])
  2479  		}
  2480  	}
  2481  }
  2482  
  2483  func TestSqrt(t *testing.T) {
  2484  	for i := 0; i < len(vf); i++ {
  2485  		a := Abs(vf[i])
  2486  		if f := SqrtGo(a); sqrt[i] != f {
  2487  			t.Errorf("SqrtGo(%g) = %g, want %g", a, f, sqrt[i])
  2488  		}
  2489  		a = Abs(vf[i])
  2490  		if f := Sqrt(a); sqrt[i] != f {
  2491  			t.Errorf("Sqrt(%g) = %g, want %g", a, f, sqrt[i])
  2492  		}
  2493  	}
  2494  	for i := 0; i < len(vfsqrtSC); i++ {
  2495  		if f := SqrtGo(vfsqrtSC[i]); !alike(sqrtSC[i], f) {
  2496  			t.Errorf("SqrtGo(%g) = %g, want %g", vfsqrtSC[i], f, sqrtSC[i])
  2497  		}
  2498  		if f := Sqrt(vfsqrtSC[i]); !alike(sqrtSC[i], f) {
  2499  			t.Errorf("Sqrt(%g) = %g, want %g", vfsqrtSC[i], f, sqrtSC[i])
  2500  		}
  2501  	}
  2502  }
  2503  
  2504  func TestTan(t *testing.T) {
  2505  	for i := 0; i < len(vf); i++ {
  2506  		if f := Tan(vf[i]); !veryclose(tan[i], f) {
  2507  			t.Errorf("Tan(%g) = %g, want %g", vf[i], f, tan[i])
  2508  		}
  2509  	}
  2510  	// same special cases as Sin
  2511  	for i := 0; i < len(vfsinSC); i++ {
  2512  		if f := Tan(vfsinSC[i]); !alike(sinSC[i], f) {
  2513  			t.Errorf("Tan(%g) = %g, want %g", vfsinSC[i], f, sinSC[i])
  2514  		}
  2515  	}
  2516  }
  2517  
  2518  func TestTanh(t *testing.T) {
  2519  	for i := 0; i < len(vf); i++ {
  2520  		if f := Tanh(vf[i]); !veryclose(tanh[i], f) {
  2521  			t.Errorf("Tanh(%g) = %g, want %g", vf[i], f, tanh[i])
  2522  		}
  2523  	}
  2524  	for i := 0; i < len(vftanhSC); i++ {
  2525  		if f := Tanh(vftanhSC[i]); !alike(tanhSC[i], f) {
  2526  			t.Errorf("Tanh(%g) = %g, want %g", vftanhSC[i], f, tanhSC[i])
  2527  		}
  2528  	}
  2529  }
  2530  
  2531  func TestTrunc(t *testing.T) {
  2532  	for i := 0; i < len(vf); i++ {
  2533  		if f := Trunc(vf[i]); trunc[i] != f {
  2534  			t.Errorf("Trunc(%g) = %g, want %g", vf[i], f, trunc[i])
  2535  		}
  2536  	}
  2537  	for i := 0; i < len(vfceilSC); i++ {
  2538  		if f := Trunc(vfceilSC[i]); !alike(ceilSC[i], f) {
  2539  			t.Errorf("Trunc(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i])
  2540  		}
  2541  	}
  2542  }
  2543  
  2544  func TestY0(t *testing.T) {
  2545  	for i := 0; i < len(vf); i++ {
  2546  		a := Abs(vf[i])
  2547  		if f := Y0(a); !close(y0[i], f) {
  2548  			t.Errorf("Y0(%g) = %g, want %g", a, f, y0[i])
  2549  		}
  2550  	}
  2551  	for i := 0; i < len(vfy0SC); i++ {
  2552  		if f := Y0(vfy0SC[i]); !alike(y0SC[i], f) {
  2553  			t.Errorf("Y0(%g) = %g, want %g", vfy0SC[i], f, y0SC[i])
  2554  		}
  2555  	}
  2556  }
  2557  
  2558  func TestY1(t *testing.T) {
  2559  	for i := 0; i < len(vf); i++ {
  2560  		a := Abs(vf[i])
  2561  		if f := Y1(a); !soclose(y1[i], f, 2e-14) {
  2562  			t.Errorf("Y1(%g) = %g, want %g", a, f, y1[i])
  2563  		}
  2564  	}
  2565  	for i := 0; i < len(vfy0SC); i++ {
  2566  		if f := Y1(vfy0SC[i]); !alike(y1SC[i], f) {
  2567  			t.Errorf("Y1(%g) = %g, want %g", vfy0SC[i], f, y1SC[i])
  2568  		}
  2569  	}
  2570  }
  2571  
  2572  func TestYn(t *testing.T) {
  2573  	for i := 0; i < len(vf); i++ {
  2574  		a := Abs(vf[i])
  2575  		if f := Yn(2, a); !close(y2[i], f) {
  2576  			t.Errorf("Yn(2, %g) = %g, want %g", a, f, y2[i])
  2577  		}
  2578  		if f := Yn(-3, a); !close(yM3[i], f) {
  2579  			t.Errorf("Yn(-3, %g) = %g, want %g", a, f, yM3[i])
  2580  		}
  2581  	}
  2582  	for i := 0; i < len(vfy0SC); i++ {
  2583  		if f := Yn(2, vfy0SC[i]); !alike(y2SC[i], f) {
  2584  			t.Errorf("Yn(2, %g) = %g, want %g", vfy0SC[i], f, y2SC[i])
  2585  		}
  2586  		if f := Yn(-3, vfy0SC[i]); !alike(yM3SC[i], f) {
  2587  			t.Errorf("Yn(-3, %g) = %g, want %g", vfy0SC[i], f, yM3SC[i])
  2588  		}
  2589  	}
  2590  }
  2591  
  2592  // Check that math functions of high angle values
  2593  // return accurate results. [Since (vf[i] + large) - large != vf[i],
  2594  // testing for Trig(vf[i] + large) == Trig(vf[i]), where large is
  2595  // a multiple of 2*Pi, is misleading.]
  2596  func TestLargeCos(t *testing.T) {
  2597  	large := float64(100000 * Pi)
  2598  	for i := 0; i < len(vf); i++ {
  2599  		f1 := cosLarge[i]
  2600  		f2 := Cos(vf[i] + large)
  2601  		if !close(f1, f2) {
  2602  			t.Errorf("Cos(%g) = %g, want %g", vf[i]+large, f2, f1)
  2603  		}
  2604  	}
  2605  }
  2606  
  2607  func TestLargeSin(t *testing.T) {
  2608  	large := float64(100000 * Pi)
  2609  	for i := 0; i < len(vf); i++ {
  2610  		f1 := sinLarge[i]
  2611  		f2 := Sin(vf[i] + large)
  2612  		if !close(f1, f2) {
  2613  			t.Errorf("Sin(%g) = %g, want %g", vf[i]+large, f2, f1)
  2614  		}
  2615  	}
  2616  }
  2617  
  2618  func TestLargeSincos(t *testing.T) {
  2619  	large := float64(100000 * Pi)
  2620  	for i := 0; i < len(vf); i++ {
  2621  		f1, g1 := sinLarge[i], cosLarge[i]
  2622  		f2, g2 := Sincos(vf[i] + large)
  2623  		if !close(f1, f2) || !close(g1, g2) {
  2624  			t.Errorf("Sincos(%g) = %g, %g, want %g, %g", vf[i]+large, f2, g2, f1, g1)
  2625  		}
  2626  	}
  2627  }
  2628  
  2629  func TestLargeTan(t *testing.T) {
  2630  	large := float64(100000 * Pi)
  2631  	for i := 0; i < len(vf); i++ {
  2632  		f1 := tanLarge[i]
  2633  		f2 := Tan(vf[i] + large)
  2634  		if !close(f1, f2) {
  2635  			t.Errorf("Tan(%g) = %g, want %g", vf[i]+large, f2, f1)
  2636  		}
  2637  	}
  2638  }
  2639  
  2640  // Check that math constants are accepted by compiler
  2641  // and have right value (assumes strconv.ParseFloat works).
  2642  // http://golang.org/issue/201
  2643  
  2644  type floatTest struct {
  2645  	val  interface{}
  2646  	name string
  2647  	str  string
  2648  }
  2649  
  2650  var floatTests = []floatTest{
  2651  	{float64(MaxFloat64), "MaxFloat64", "1.7976931348623157e+308"},
  2652  	{float64(SmallestNonzeroFloat64), "SmallestNonzeroFloat64", "5e-324"},
  2653  	{float32(MaxFloat32), "MaxFloat32", "3.4028235e+38"},
  2654  	{float32(SmallestNonzeroFloat32), "SmallestNonzeroFloat32", "1e-45"},
  2655  }
  2656  
  2657  func TestFloatMinMax(t *testing.T) {
  2658  	for _, tt := range floatTests {
  2659  		s := fmt.Sprint(tt.val)
  2660  		if s != tt.str {
  2661  			t.Errorf("Sprint(%v) = %s, want %s", tt.name, s, tt.str)
  2662  		}
  2663  	}
  2664  }
  2665  
  2666  // Benchmarks
  2667  
  2668  func BenchmarkAcos(b *testing.B) {
  2669  	for i := 0; i < b.N; i++ {
  2670  		Acos(.5)
  2671  	}
  2672  }
  2673  
  2674  func BenchmarkAcosh(b *testing.B) {
  2675  	for i := 0; i < b.N; i++ {
  2676  		Acosh(1.5)
  2677  	}
  2678  }
  2679  
  2680  func BenchmarkAsin(b *testing.B) {
  2681  	for i := 0; i < b.N; i++ {
  2682  		Asin(.5)
  2683  	}
  2684  }
  2685  
  2686  func BenchmarkAsinh(b *testing.B) {
  2687  	for i := 0; i < b.N; i++ {
  2688  		Asinh(.5)
  2689  	}
  2690  }
  2691  
  2692  func BenchmarkAtan(b *testing.B) {
  2693  	for i := 0; i < b.N; i++ {
  2694  		Atan(.5)
  2695  	}
  2696  }
  2697  
  2698  func BenchmarkAtanh(b *testing.B) {
  2699  	for i := 0; i < b.N; i++ {
  2700  		Atanh(.5)
  2701  	}
  2702  }
  2703  
  2704  func BenchmarkAtan2(b *testing.B) {
  2705  	for i := 0; i < b.N; i++ {
  2706  		Atan2(.5, 1)
  2707  	}
  2708  }
  2709  
  2710  func BenchmarkCbrt(b *testing.B) {
  2711  	for i := 0; i < b.N; i++ {
  2712  		Cbrt(10)
  2713  	}
  2714  }
  2715  
  2716  func BenchmarkCeil(b *testing.B) {
  2717  	for i := 0; i < b.N; i++ {
  2718  		Ceil(.5)
  2719  	}
  2720  }
  2721  
  2722  func BenchmarkCopysign(b *testing.B) {
  2723  	for i := 0; i < b.N; i++ {
  2724  		Copysign(.5, -1)
  2725  	}
  2726  }
  2727  
  2728  func BenchmarkCos(b *testing.B) {
  2729  	for i := 0; i < b.N; i++ {
  2730  		Cos(.5)
  2731  	}
  2732  }
  2733  
  2734  func BenchmarkCosh(b *testing.B) {
  2735  	for i := 0; i < b.N; i++ {
  2736  		Cosh(2.5)
  2737  	}
  2738  }
  2739  
  2740  func BenchmarkErf(b *testing.B) {
  2741  	for i := 0; i < b.N; i++ {
  2742  		Erf(.5)
  2743  	}
  2744  }
  2745  
  2746  func BenchmarkErfc(b *testing.B) {
  2747  	for i := 0; i < b.N; i++ {
  2748  		Erfc(.5)
  2749  	}
  2750  }
  2751  
  2752  func BenchmarkExp(b *testing.B) {
  2753  	for i := 0; i < b.N; i++ {
  2754  		Exp(.5)
  2755  	}
  2756  }
  2757  
  2758  func BenchmarkExpGo(b *testing.B) {
  2759  	for i := 0; i < b.N; i++ {
  2760  		ExpGo(.5)
  2761  	}
  2762  }
  2763  
  2764  func BenchmarkExpm1(b *testing.B) {
  2765  	for i := 0; i < b.N; i++ {
  2766  		Expm1(.5)
  2767  	}
  2768  }
  2769  
  2770  func BenchmarkExp2(b *testing.B) {
  2771  	for i := 0; i < b.N; i++ {
  2772  		Exp2(.5)
  2773  	}
  2774  }
  2775  
  2776  func BenchmarkExp2Go(b *testing.B) {
  2777  	for i := 0; i < b.N; i++ {
  2778  		Exp2Go(.5)
  2779  	}
  2780  }
  2781  
  2782  func BenchmarkAbs(b *testing.B) {
  2783  	for i := 0; i < b.N; i++ {
  2784  		Abs(.5)
  2785  	}
  2786  }
  2787  
  2788  func BenchmarkDim(b *testing.B) {
  2789  	for i := 0; i < b.N; i++ {
  2790  		Dim(10, 3)
  2791  	}
  2792  }
  2793  
  2794  func BenchmarkFloor(b *testing.B) {
  2795  	for i := 0; i < b.N; i++ {
  2796  		Floor(.5)
  2797  	}
  2798  }
  2799  
  2800  func BenchmarkMax(b *testing.B) {
  2801  	for i := 0; i < b.N; i++ {
  2802  		Max(10, 3)
  2803  	}
  2804  }
  2805  
  2806  func BenchmarkMin(b *testing.B) {
  2807  	for i := 0; i < b.N; i++ {
  2808  		Min(10, 3)
  2809  	}
  2810  }
  2811  
  2812  func BenchmarkMod(b *testing.B) {
  2813  	for i := 0; i < b.N; i++ {
  2814  		Mod(10, 3)
  2815  	}
  2816  }
  2817  
  2818  func BenchmarkFrexp(b *testing.B) {
  2819  	for i := 0; i < b.N; i++ {
  2820  		Frexp(8)
  2821  	}
  2822  }
  2823  
  2824  func BenchmarkGamma(b *testing.B) {
  2825  	for i := 0; i < b.N; i++ {
  2826  		Gamma(2.5)
  2827  	}
  2828  }
  2829  
  2830  func BenchmarkHypot(b *testing.B) {
  2831  	for i := 0; i < b.N; i++ {
  2832  		Hypot(3, 4)
  2833  	}
  2834  }
  2835  
  2836  func BenchmarkHypotGo(b *testing.B) {
  2837  	for i := 0; i < b.N; i++ {
  2838  		HypotGo(3, 4)
  2839  	}
  2840  }
  2841  
  2842  func BenchmarkIlogb(b *testing.B) {
  2843  	for i := 0; i < b.N; i++ {
  2844  		Ilogb(.5)
  2845  	}
  2846  }
  2847  
  2848  func BenchmarkJ0(b *testing.B) {
  2849  	for i := 0; i < b.N; i++ {
  2850  		J0(2.5)
  2851  	}
  2852  }
  2853  
  2854  func BenchmarkJ1(b *testing.B) {
  2855  	for i := 0; i < b.N; i++ {
  2856  		J1(2.5)
  2857  	}
  2858  }
  2859  
  2860  func BenchmarkJn(b *testing.B) {
  2861  	for i := 0; i < b.N; i++ {
  2862  		Jn(2, 2.5)
  2863  	}
  2864  }
  2865  
  2866  func BenchmarkLdexp(b *testing.B) {
  2867  	for i := 0; i < b.N; i++ {
  2868  		Ldexp(.5, 2)
  2869  	}
  2870  }
  2871  
  2872  func BenchmarkLgamma(b *testing.B) {
  2873  	for i := 0; i < b.N; i++ {
  2874  		Lgamma(2.5)
  2875  	}
  2876  }
  2877  
  2878  func BenchmarkLog(b *testing.B) {
  2879  	for i := 0; i < b.N; i++ {
  2880  		Log(.5)
  2881  	}
  2882  }
  2883  
  2884  func BenchmarkLogb(b *testing.B) {
  2885  	for i := 0; i < b.N; i++ {
  2886  		Logb(.5)
  2887  	}
  2888  }
  2889  
  2890  func BenchmarkLog1p(b *testing.B) {
  2891  	for i := 0; i < b.N; i++ {
  2892  		Log1p(.5)
  2893  	}
  2894  }
  2895  
  2896  func BenchmarkLog10(b *testing.B) {
  2897  	for i := 0; i < b.N; i++ {
  2898  		Log10(.5)
  2899  	}
  2900  }
  2901  
  2902  func BenchmarkLog2(b *testing.B) {
  2903  	for i := 0; i < b.N; i++ {
  2904  		Log2(.5)
  2905  	}
  2906  }
  2907  
  2908  func BenchmarkModf(b *testing.B) {
  2909  	for i := 0; i < b.N; i++ {
  2910  		Modf(1.5)
  2911  	}
  2912  }
  2913  
  2914  func BenchmarkNextafter32(b *testing.B) {
  2915  	for i := 0; i < b.N; i++ {
  2916  		Nextafter32(.5, 1)
  2917  	}
  2918  }
  2919  
  2920  func BenchmarkNextafter64(b *testing.B) {
  2921  	for i := 0; i < b.N; i++ {
  2922  		Nextafter(.5, 1)
  2923  	}
  2924  }
  2925  
  2926  func BenchmarkPowInt(b *testing.B) {
  2927  	for i := 0; i < b.N; i++ {
  2928  		Pow(2, 2)
  2929  	}
  2930  }
  2931  
  2932  func BenchmarkPowFrac(b *testing.B) {
  2933  	for i := 0; i < b.N; i++ {
  2934  		Pow(2.5, 1.5)
  2935  	}
  2936  }
  2937  
  2938  func BenchmarkPow10Pos(b *testing.B) {
  2939  	for i := 0; i < b.N; i++ {
  2940  		Pow10(300)
  2941  	}
  2942  }
  2943  
  2944  func BenchmarkPow10Neg(b *testing.B) {
  2945  	for i := 0; i < b.N; i++ {
  2946  		Pow10(-300)
  2947  	}
  2948  }
  2949  
  2950  func BenchmarkRemainder(b *testing.B) {
  2951  	for i := 0; i < b.N; i++ {
  2952  		Remainder(10, 3)
  2953  	}
  2954  }
  2955  
  2956  func BenchmarkSignbit(b *testing.B) {
  2957  	for i := 0; i < b.N; i++ {
  2958  		Signbit(2.5)
  2959  	}
  2960  }
  2961  
  2962  func BenchmarkSin(b *testing.B) {
  2963  	for i := 0; i < b.N; i++ {
  2964  		Sin(.5)
  2965  	}
  2966  }
  2967  
  2968  func BenchmarkSincos(b *testing.B) {
  2969  	for i := 0; i < b.N; i++ {
  2970  		Sincos(.5)
  2971  	}
  2972  }
  2973  
  2974  func BenchmarkSinh(b *testing.B) {
  2975  	for i := 0; i < b.N; i++ {
  2976  		Sinh(2.5)
  2977  	}
  2978  }
  2979  
  2980  var Global float64
  2981  
  2982  func BenchmarkSqrt(b *testing.B) {
  2983  	x, y := 0.0, 10.0
  2984  	for i := 0; i < b.N; i++ {
  2985  		x += Sqrt(y)
  2986  	}
  2987  	Global = x
  2988  }
  2989  
  2990  func BenchmarkSqrtIndirect(b *testing.B) {
  2991  	x, y := 0.0, 10.0
  2992  	f := Sqrt
  2993  	for i := 0; i < b.N; i++ {
  2994  		x += f(y)
  2995  	}
  2996  	Global = x
  2997  }
  2998  
  2999  func BenchmarkSqrtGo(b *testing.B) {
  3000  	x, y := 0.0, 10.0
  3001  	for i := 0; i < b.N; i++ {
  3002  		x += SqrtGo(y)
  3003  	}
  3004  	Global = x
  3005  }
  3006  
  3007  func isPrime(i int) bool {
  3008  	// Yes, this is a dumb way to write this code,
  3009  	// but calling Sqrt repeatedly in this way demonstrates
  3010  	// the benefit of using a direct SQRT instruction on systems
  3011  	// that have one, whereas the obvious loop seems not to
  3012  	// demonstrate such a benefit.
  3013  	for j := 2; float64(j) <= Sqrt(float64(i)); j++ {
  3014  		if i%j == 0 {
  3015  			return false
  3016  		}
  3017  	}
  3018  	return true
  3019  }
  3020  
  3021  func BenchmarkSqrtPrime(b *testing.B) {
  3022  	any := false
  3023  	for i := 0; i < b.N; i++ {
  3024  		if isPrime(100003) {
  3025  			any = true
  3026  		}
  3027  	}
  3028  	if any {
  3029  		Global = 1
  3030  	}
  3031  }
  3032  
  3033  func BenchmarkTan(b *testing.B) {
  3034  	for i := 0; i < b.N; i++ {
  3035  		Tan(.5)
  3036  	}
  3037  }
  3038  
  3039  func BenchmarkTanh(b *testing.B) {
  3040  	for i := 0; i < b.N; i++ {
  3041  		Tanh(2.5)
  3042  	}
  3043  }
  3044  func BenchmarkTrunc(b *testing.B) {
  3045  	for i := 0; i < b.N; i++ {
  3046  		Trunc(.5)
  3047  	}
  3048  }
  3049  
  3050  func BenchmarkY0(b *testing.B) {
  3051  	for i := 0; i < b.N; i++ {
  3052  		Y0(2.5)
  3053  	}
  3054  }
  3055  
  3056  func BenchmarkY1(b *testing.B) {
  3057  	for i := 0; i < b.N; i++ {
  3058  		Y1(2.5)
  3059  	}
  3060  }
  3061  
  3062  func BenchmarkYn(b *testing.B) {
  3063  	for i := 0; i < b.N; i++ {
  3064  		Yn(2, 2.5)
  3065  	}
  3066  }