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