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