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), 0.5}, 1593 {Inf(-1), NaN()}, 1594 1595 {-Pi, Inf(-1)}, 1596 {-Pi, -Pi}, 1597 {-Pi, Copysign(0, -1)}, 1598 {-Pi, 0}, 1599 {-Pi, 1}, 1600 {-Pi, Pi}, 1601 {-Pi, Inf(1)}, 1602 {-Pi, NaN()}, 1603 1604 {-1, Inf(-1)}, 1605 {-1, Inf(1)}, 1606 {-1, NaN()}, 1607 {-1 / 2, Inf(-1)}, 1608 {-1 / 2, Inf(1)}, 1609 {Copysign(0, -1), Inf(-1)}, 1610 {Copysign(0, -1), -Pi}, 1611 {Copysign(0, -1), -0.5}, 1612 {Copysign(0, -1), -3}, 1613 {Copysign(0, -1), 3}, 1614 {Copysign(0, -1), Pi}, 1615 {Copysign(0, -1), 0.5}, 1616 {Copysign(0, -1), Inf(1)}, 1617 1618 {0, Inf(-1)}, 1619 {0, -Pi}, 1620 {0, -3}, 1621 {0, Copysign(0, -1)}, 1622 {0, 0}, 1623 {0, 3}, 1624 {0, Pi}, 1625 {0, Inf(1)}, 1626 {0, NaN()}, 1627 1628 {1 / 2, Inf(-1)}, 1629 {1 / 2, Inf(1)}, 1630 {1, Inf(-1)}, 1631 {1, Inf(1)}, 1632 {1, NaN()}, 1633 1634 {Pi, Inf(-1)}, 1635 {Pi, Copysign(0, -1)}, 1636 {Pi, 0}, 1637 {Pi, 1}, 1638 {Pi, Inf(1)}, 1639 {Pi, NaN()}, 1640 {Inf(1), -Pi}, 1641 {Inf(1), Copysign(0, -1)}, 1642 {Inf(1), 0}, 1643 {Inf(1), 1}, 1644 {Inf(1), Pi}, 1645 {Inf(1), NaN()}, 1646 {NaN(), -Pi}, 1647 {NaN(), Copysign(0, -1)}, 1648 {NaN(), 0}, 1649 {NaN(), 1}, 1650 {NaN(), Pi}, 1651 {NaN(), NaN()}, 1652 1653 // Issue #7394 overflow checks 1654 {2, float64(1 << 32)}, 1655 {2, -float64(1 << 32)}, 1656 {-2, float64(1<<32 + 1)}, 1657 {1 / 2, float64(1 << 45)}, 1658 {1 / 2, -float64(1 << 45)}, 1659 {Nextafter(1, 2), float64(1 << 63)}, 1660 {Nextafter(1, -2), float64(1 << 63)}, 1661 {Nextafter(-1, 2), float64(1 << 63)}, 1662 {Nextafter(-1, -2), float64(1 << 63)}, 1663 } 1664 var powSC = []float64{ 1665 0, // pow(-Inf, -Pi) 1666 Copysign(0, -1), // pow(-Inf, -3) 1667 1, // pow(-Inf, -0) 1668 1, // pow(-Inf, +0) 1669 Inf(-1), // pow(-Inf, 1) 1670 Inf(-1), // pow(-Inf, 3) 1671 Inf(1), // pow(-Inf, Pi) 1672 Inf(1), // pow(-Inf, 0.5) 1673 NaN(), // pow(-Inf, NaN) 1674 0, // pow(-Pi, -Inf) 1675 NaN(), // pow(-Pi, -Pi) 1676 1, // pow(-Pi, -0) 1677 1, // pow(-Pi, +0) 1678 -Pi, // pow(-Pi, 1) 1679 NaN(), // pow(-Pi, Pi) 1680 Inf(1), // pow(-Pi, +Inf) 1681 NaN(), // pow(-Pi, NaN) 1682 1, // pow(-1, -Inf) IEEE 754-2008 1683 1, // pow(-1, +Inf) IEEE 754-2008 1684 NaN(), // pow(-1, NaN) 1685 Inf(1), // pow(-1/2, -Inf) 1686 0, // pow(-1/2, +Inf) 1687 Inf(1), // pow(-0, -Inf) 1688 Inf(1), // pow(-0, -Pi) 1689 Inf(1), // pow(-0, -0.5) 1690 Inf(-1), // pow(-0, -3) IEEE 754-2008 1691 Copysign(0, -1), // pow(-0, 3) IEEE 754-2008 1692 0, // pow(-0, +Pi) 1693 0, // pow(-0, 0.5) 1694 0, // pow(-0, +Inf) 1695 Inf(1), // pow(+0, -Inf) 1696 Inf(1), // pow(+0, -Pi) 1697 Inf(1), // pow(+0, -3) 1698 1, // pow(+0, -0) 1699 1, // pow(+0, +0) 1700 0, // pow(+0, 3) 1701 0, // pow(+0, +Pi) 1702 0, // pow(+0, +Inf) 1703 NaN(), // pow(+0, NaN) 1704 Inf(1), // pow(1/2, -Inf) 1705 0, // pow(1/2, +Inf) 1706 1, // pow(1, -Inf) IEEE 754-2008 1707 1, // pow(1, +Inf) IEEE 754-2008 1708 1, // pow(1, NaN) IEEE 754-2008 1709 0, // pow(+Pi, -Inf) 1710 1, // pow(+Pi, -0) 1711 1, // pow(+Pi, +0) 1712 Pi, // pow(+Pi, 1) 1713 Inf(1), // pow(+Pi, +Inf) 1714 NaN(), // pow(+Pi, NaN) 1715 0, // pow(+Inf, -Pi) 1716 1, // pow(+Inf, -0) 1717 1, // pow(+Inf, +0) 1718 Inf(1), // pow(+Inf, 1) 1719 Inf(1), // pow(+Inf, Pi) 1720 NaN(), // pow(+Inf, NaN) 1721 NaN(), // pow(NaN, -Pi) 1722 1, // pow(NaN, -0) 1723 1, // pow(NaN, +0) 1724 NaN(), // pow(NaN, 1) 1725 NaN(), // pow(NaN, +Pi) 1726 NaN(), // pow(NaN, NaN) 1727 1728 // Issue #7394 overflow checks 1729 Inf(1), // pow(2, float64(1 << 32)) 1730 0, // pow(2, -float64(1 << 32)) 1731 Inf(-1), // pow(-2, float64(1<<32 + 1)) 1732 0, // pow(1/2, float64(1 << 45)) 1733 Inf(1), // pow(1/2, -float64(1 << 45)) 1734 Inf(1), // pow(Nextafter(1, 2), float64(1 << 63)) 1735 0, // pow(Nextafter(1, -2), float64(1 << 63)) 1736 0, // pow(Nextafter(-1, 2), float64(1 << 63)) 1737 Inf(1), // pow(Nextafter(-1, -2), float64(1 << 63)) 1738 } 1739 1740 var vfpow10SC = []int{ 1741 MinInt32, 1742 -324, 1743 -323, 1744 -50, 1745 -22, 1746 -1, 1747 0, 1748 1, 1749 22, 1750 50, 1751 100, 1752 200, 1753 308, 1754 309, 1755 MaxInt32, 1756 } 1757 1758 var pow10SC = []float64{ 1759 0, // pow10(MinInt32) 1760 0, // pow10(-324) 1761 1.0e-323, // pow10(-323) 1762 1.0e-50, // pow10(-50) 1763 1.0e-22, // pow10(-22) 1764 1.0e-1, // pow10(-1) 1765 1.0e0, // pow10(0) 1766 1.0e1, // pow10(1) 1767 1.0e22, // pow10(22) 1768 1.0e50, // pow10(50) 1769 1.0e100, // pow10(100) 1770 1.0e200, // pow10(200) 1771 1.0e308, // pow10(308) 1772 Inf(1), // pow10(309) 1773 Inf(1), // pow10(MaxInt32) 1774 } 1775 1776 var vfroundSC = [][2]float64{ 1777 {0, 0}, 1778 {1.390671161567e-309, 0}, // denormal 1779 {0.49999999999999994, 0}, // 0.5-epsilon 1780 {0.5, 1}, 1781 {0.5000000000000001, 1}, // 0.5+epsilon 1782 {-1.5, -2}, 1783 {-2.5, -3}, 1784 {NaN(), NaN()}, 1785 {Inf(1), Inf(1)}, 1786 {2251799813685249.5, 2251799813685250}, // 1 bit fraction 1787 {2251799813685250.5, 2251799813685251}, 1788 {4503599627370495.5, 4503599627370496}, // 1 bit fraction, rounding to 0 bit fraction 1789 {4503599627370497, 4503599627370497}, // large integer 1790 } 1791 var vfroundEvenSC = [][2]float64{ 1792 {0, 0}, 1793 {1.390671161567e-309, 0}, // denormal 1794 {0.49999999999999994, 0}, // 0.5-epsilon 1795 {0.5, 0}, 1796 {0.5000000000000001, 1}, // 0.5+epsilon 1797 {-1.5, -2}, 1798 {-2.5, -2}, 1799 {NaN(), NaN()}, 1800 {Inf(1), Inf(1)}, 1801 {2251799813685249.5, 2251799813685250}, // 1 bit fraction 1802 {2251799813685250.5, 2251799813685250}, 1803 {4503599627370495.5, 4503599627370496}, // 1 bit fraction, rounding to 0 bit fraction 1804 {4503599627370497, 4503599627370497}, // large integer 1805 } 1806 1807 var vfsignbitSC = []float64{ 1808 Inf(-1), 1809 Copysign(0, -1), 1810 0, 1811 Inf(1), 1812 NaN(), 1813 } 1814 var signbitSC = []bool{ 1815 true, 1816 true, 1817 false, 1818 false, 1819 false, 1820 } 1821 1822 var vfsinSC = []float64{ 1823 Inf(-1), 1824 Copysign(0, -1), 1825 0, 1826 Inf(1), 1827 NaN(), 1828 } 1829 var sinSC = []float64{ 1830 NaN(), 1831 Copysign(0, -1), 1832 0, 1833 NaN(), 1834 NaN(), 1835 } 1836 1837 var vfsinhSC = []float64{ 1838 Inf(-1), 1839 Copysign(0, -1), 1840 0, 1841 Inf(1), 1842 NaN(), 1843 } 1844 var sinhSC = []float64{ 1845 Inf(-1), 1846 Copysign(0, -1), 1847 0, 1848 Inf(1), 1849 NaN(), 1850 } 1851 1852 var vfsqrtSC = []float64{ 1853 Inf(-1), 1854 -Pi, 1855 Copysign(0, -1), 1856 0, 1857 Inf(1), 1858 NaN(), 1859 Float64frombits(2), // subnormal; see https://golang.org/issue/13013 1860 } 1861 var sqrtSC = []float64{ 1862 NaN(), 1863 NaN(), 1864 Copysign(0, -1), 1865 0, 1866 Inf(1), 1867 NaN(), 1868 3.1434555694052576e-162, 1869 } 1870 1871 var vftanhSC = []float64{ 1872 Inf(-1), 1873 Copysign(0, -1), 1874 0, 1875 Inf(1), 1876 NaN(), 1877 } 1878 var tanhSC = []float64{ 1879 -1, 1880 Copysign(0, -1), 1881 0, 1882 1, 1883 NaN(), 1884 } 1885 1886 var vfy0SC = []float64{ 1887 Inf(-1), 1888 0, 1889 Inf(1), 1890 NaN(), 1891 -1, 1892 } 1893 var y0SC = []float64{ 1894 NaN(), 1895 Inf(-1), 1896 0, 1897 NaN(), 1898 NaN(), 1899 } 1900 var y1SC = []float64{ 1901 NaN(), 1902 Inf(-1), 1903 0, 1904 NaN(), 1905 NaN(), 1906 } 1907 var y2SC = []float64{ 1908 NaN(), 1909 Inf(-1), 1910 0, 1911 NaN(), 1912 NaN(), 1913 } 1914 var yM3SC = []float64{ 1915 NaN(), 1916 Inf(1), 1917 0, 1918 NaN(), 1919 NaN(), 1920 } 1921 1922 // arguments and expected results for boundary cases 1923 const ( 1924 SmallestNormalFloat64 = 2.2250738585072014e-308 // 2**-1022 1925 LargestSubnormalFloat64 = SmallestNormalFloat64 - SmallestNonzeroFloat64 1926 ) 1927 1928 var vffrexpBC = []float64{ 1929 SmallestNormalFloat64, 1930 LargestSubnormalFloat64, 1931 SmallestNonzeroFloat64, 1932 MaxFloat64, 1933 -SmallestNormalFloat64, 1934 -LargestSubnormalFloat64, 1935 -SmallestNonzeroFloat64, 1936 -MaxFloat64, 1937 } 1938 var frexpBC = []fi{ 1939 {0.5, -1021}, 1940 {0.99999999999999978, -1022}, 1941 {0.5, -1073}, 1942 {0.99999999999999989, 1024}, 1943 {-0.5, -1021}, 1944 {-0.99999999999999978, -1022}, 1945 {-0.5, -1073}, 1946 {-0.99999999999999989, 1024}, 1947 } 1948 1949 var vfldexpBC = []fi{ 1950 {SmallestNormalFloat64, -52}, 1951 {LargestSubnormalFloat64, -51}, 1952 {SmallestNonzeroFloat64, 1074}, 1953 {MaxFloat64, -(1023 + 1074)}, 1954 {1, -1075}, 1955 {-1, -1075}, 1956 {1, 1024}, 1957 {-1, 1024}, 1958 } 1959 var ldexpBC = []float64{ 1960 SmallestNonzeroFloat64, 1961 1e-323, // 2**-1073 1962 1, 1963 1e-323, // 2**-1073 1964 0, 1965 Copysign(0, -1), 1966 Inf(1), 1967 Inf(-1), 1968 } 1969 1970 var logbBC = []float64{ 1971 -1022, 1972 -1023, 1973 -1074, 1974 1023, 1975 -1022, 1976 -1023, 1977 -1074, 1978 1023, 1979 } 1980 1981 func tolerance(a, b, e float64) bool { 1982 // Multiplying by e here can underflow denormal values to zero. 1983 // Check a==b so that at least if a and b are small and identical 1984 // we say they match. 1985 if a == b { 1986 return true 1987 } 1988 d := a - b 1989 if d < 0 { 1990 d = -d 1991 } 1992 1993 // note: b is correct (expected) value, a is actual value. 1994 // make error tolerance a fraction of b, not a. 1995 if b != 0 { 1996 e = e * b 1997 if e < 0 { 1998 e = -e 1999 } 2000 } 2001 return d < e 2002 } 2003 func close(a, b float64) bool { return tolerance(a, b, 1e-14) } 2004 func veryclose(a, b float64) bool { return tolerance(a, b, 4e-16) } 2005 func soclose(a, b, e float64) bool { return tolerance(a, b, e) } 2006 func alike(a, b float64) bool { 2007 switch { 2008 case IsNaN(a) && IsNaN(b): 2009 return true 2010 case a == b: 2011 return Signbit(a) == Signbit(b) 2012 } 2013 return false 2014 } 2015 2016 func TestNaN(t *testing.T) { 2017 f64 := NaN() 2018 if f64 == f64 { 2019 t.Fatalf("NaN() returns %g, expected NaN", f64) 2020 } 2021 f32 := float32(f64) 2022 if f32 == f32 { 2023 t.Fatalf("float32(NaN()) is %g, expected NaN", f32) 2024 } 2025 } 2026 2027 func TestAcos(t *testing.T) { 2028 for i := 0; i < len(vf); i++ { 2029 a := vf[i] / 10 2030 if f := Acos(a); !close(acos[i], f) { 2031 t.Errorf("Acos(%g) = %g, want %g", a, f, acos[i]) 2032 } 2033 } 2034 for i := 0; i < len(vfacosSC); i++ { 2035 if f := Acos(vfacosSC[i]); !alike(acosSC[i], f) { 2036 t.Errorf("Acos(%g) = %g, want %g", vfacosSC[i], f, acosSC[i]) 2037 } 2038 } 2039 } 2040 2041 func TestAcosh(t *testing.T) { 2042 for i := 0; i < len(vf); i++ { 2043 a := 1 + Abs(vf[i]) 2044 if f := Acosh(a); !veryclose(acosh[i], f) { 2045 t.Errorf("Acosh(%g) = %g, want %g", a, f, acosh[i]) 2046 } 2047 } 2048 for i := 0; i < len(vfacoshSC); i++ { 2049 if f := Acosh(vfacoshSC[i]); !alike(acoshSC[i], f) { 2050 t.Errorf("Acosh(%g) = %g, want %g", vfacoshSC[i], f, acoshSC[i]) 2051 } 2052 } 2053 } 2054 2055 func TestAsin(t *testing.T) { 2056 for i := 0; i < len(vf); i++ { 2057 a := vf[i] / 10 2058 if f := Asin(a); !veryclose(asin[i], f) { 2059 t.Errorf("Asin(%g) = %g, want %g", a, f, asin[i]) 2060 } 2061 } 2062 for i := 0; i < len(vfasinSC); i++ { 2063 if f := Asin(vfasinSC[i]); !alike(asinSC[i], f) { 2064 t.Errorf("Asin(%g) = %g, want %g", vfasinSC[i], f, asinSC[i]) 2065 } 2066 } 2067 } 2068 2069 func TestAsinh(t *testing.T) { 2070 for i := 0; i < len(vf); i++ { 2071 if f := Asinh(vf[i]); !veryclose(asinh[i], f) { 2072 t.Errorf("Asinh(%g) = %g, want %g", vf[i], f, asinh[i]) 2073 } 2074 } 2075 for i := 0; i < len(vfasinhSC); i++ { 2076 if f := Asinh(vfasinhSC[i]); !alike(asinhSC[i], f) { 2077 t.Errorf("Asinh(%g) = %g, want %g", vfasinhSC[i], f, asinhSC[i]) 2078 } 2079 } 2080 } 2081 2082 func TestAtan(t *testing.T) { 2083 for i := 0; i < len(vf); i++ { 2084 if f := Atan(vf[i]); !veryclose(atan[i], f) { 2085 t.Errorf("Atan(%g) = %g, want %g", vf[i], f, atan[i]) 2086 } 2087 } 2088 for i := 0; i < len(vfatanSC); i++ { 2089 if f := Atan(vfatanSC[i]); !alike(atanSC[i], f) { 2090 t.Errorf("Atan(%g) = %g, want %g", vfatanSC[i], f, atanSC[i]) 2091 } 2092 } 2093 } 2094 2095 func TestAtanh(t *testing.T) { 2096 for i := 0; i < len(vf); i++ { 2097 a := vf[i] / 10 2098 if f := Atanh(a); !veryclose(atanh[i], f) { 2099 t.Errorf("Atanh(%g) = %g, want %g", a, f, atanh[i]) 2100 } 2101 } 2102 for i := 0; i < len(vfatanhSC); i++ { 2103 if f := Atanh(vfatanhSC[i]); !alike(atanhSC[i], f) { 2104 t.Errorf("Atanh(%g) = %g, want %g", vfatanhSC[i], f, atanhSC[i]) 2105 } 2106 } 2107 } 2108 2109 func TestAtan2(t *testing.T) { 2110 for i := 0; i < len(vf); i++ { 2111 if f := Atan2(10, vf[i]); !veryclose(atan2[i], f) { 2112 t.Errorf("Atan2(10, %g) = %g, want %g", vf[i], f, atan2[i]) 2113 } 2114 } 2115 for i := 0; i < len(vfatan2SC); i++ { 2116 if f := Atan2(vfatan2SC[i][0], vfatan2SC[i][1]); !alike(atan2SC[i], f) { 2117 t.Errorf("Atan2(%g, %g) = %g, want %g", vfatan2SC[i][0], vfatan2SC[i][1], f, atan2SC[i]) 2118 } 2119 } 2120 } 2121 2122 func TestCbrt(t *testing.T) { 2123 for i := 0; i < len(vf); i++ { 2124 if f := Cbrt(vf[i]); !veryclose(cbrt[i], f) { 2125 t.Errorf("Cbrt(%g) = %g, want %g", vf[i], f, cbrt[i]) 2126 } 2127 } 2128 for i := 0; i < len(vfcbrtSC); i++ { 2129 if f := Cbrt(vfcbrtSC[i]); !alike(cbrtSC[i], f) { 2130 t.Errorf("Cbrt(%g) = %g, want %g", vfcbrtSC[i], f, cbrtSC[i]) 2131 } 2132 } 2133 } 2134 2135 func TestCeil(t *testing.T) { 2136 for i := 0; i < len(vf); i++ { 2137 if f := Ceil(vf[i]); ceil[i] != f { 2138 t.Errorf("Ceil(%g) = %g, want %g", vf[i], f, ceil[i]) 2139 } 2140 } 2141 for i := 0; i < len(vfceilSC); i++ { 2142 if f := Ceil(vfceilSC[i]); !alike(ceilSC[i], f) { 2143 t.Errorf("Ceil(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i]) 2144 } 2145 } 2146 } 2147 2148 func TestCopysign(t *testing.T) { 2149 for i := 0; i < len(vf); i++ { 2150 if f := Copysign(vf[i], -1); copysign[i] != f { 2151 t.Errorf("Copysign(%g, -1) = %g, want %g", vf[i], f, copysign[i]) 2152 } 2153 } 2154 for i := 0; i < len(vf); i++ { 2155 if f := Copysign(vf[i], 1); -copysign[i] != f { 2156 t.Errorf("Copysign(%g, 1) = %g, want %g", vf[i], f, -copysign[i]) 2157 } 2158 } 2159 for i := 0; i < len(vfcopysignSC); i++ { 2160 if f := Copysign(vfcopysignSC[i], -1); !alike(copysignSC[i], f) { 2161 t.Errorf("Copysign(%g, -1) = %g, want %g", vfcopysignSC[i], f, copysignSC[i]) 2162 } 2163 } 2164 } 2165 2166 func TestCos(t *testing.T) { 2167 for i := 0; i < len(vf); i++ { 2168 if f := Cos(vf[i]); !veryclose(cos[i], f) { 2169 t.Errorf("Cos(%g) = %g, want %g", vf[i], f, cos[i]) 2170 } 2171 } 2172 for i := 0; i < len(vfcosSC); i++ { 2173 if f := Cos(vfcosSC[i]); !alike(cosSC[i], f) { 2174 t.Errorf("Cos(%g) = %g, want %g", vfcosSC[i], f, cosSC[i]) 2175 } 2176 } 2177 } 2178 2179 func TestCosh(t *testing.T) { 2180 for i := 0; i < len(vf); i++ { 2181 if f := Cosh(vf[i]); !close(cosh[i], f) { 2182 t.Errorf("Cosh(%g) = %g, want %g", vf[i], f, cosh[i]) 2183 } 2184 } 2185 for i := 0; i < len(vfcoshSC); i++ { 2186 if f := Cosh(vfcoshSC[i]); !alike(coshSC[i], f) { 2187 t.Errorf("Cosh(%g) = %g, want %g", vfcoshSC[i], f, coshSC[i]) 2188 } 2189 } 2190 } 2191 2192 func TestErf(t *testing.T) { 2193 for i := 0; i < len(vf); i++ { 2194 a := vf[i] / 10 2195 if f := Erf(a); !veryclose(erf[i], f) { 2196 t.Errorf("Erf(%g) = %g, want %g", a, f, erf[i]) 2197 } 2198 } 2199 for i := 0; i < len(vferfSC); i++ { 2200 if f := Erf(vferfSC[i]); !alike(erfSC[i], f) { 2201 t.Errorf("Erf(%g) = %g, want %g", vferfSC[i], f, erfSC[i]) 2202 } 2203 } 2204 } 2205 2206 func TestErfc(t *testing.T) { 2207 for i := 0; i < len(vf); i++ { 2208 a := vf[i] / 10 2209 if f := Erfc(a); !veryclose(erfc[i], f) { 2210 t.Errorf("Erfc(%g) = %g, want %g", a, f, erfc[i]) 2211 } 2212 } 2213 for i := 0; i < len(vferfcSC); i++ { 2214 if f := Erfc(vferfcSC[i]); !alike(erfcSC[i], f) { 2215 t.Errorf("Erfc(%g) = %g, want %g", vferfcSC[i], f, erfcSC[i]) 2216 } 2217 } 2218 } 2219 2220 func TestErfinv(t *testing.T) { 2221 for i := 0; i < len(vf); i++ { 2222 a := vf[i] / 10 2223 if f := Erfinv(a); !veryclose(erfinv[i], f) { 2224 t.Errorf("Erfinv(%g) = %g, want %g", a, f, erfinv[i]) 2225 } 2226 } 2227 for i := 0; i < len(vferfinvSC); i++ { 2228 if f := Erfinv(vferfinvSC[i]); !alike(erfinvSC[i], f) { 2229 t.Errorf("Erfinv(%g) = %g, want %g", vferfinvSC[i], f, erfinvSC[i]) 2230 } 2231 } 2232 for x := -0.9; x <= 0.90; x += 1e-2 { 2233 if f := Erf(Erfinv(x)); !close(x, f) { 2234 t.Errorf("Erf(Erfinv(%g)) = %g, want %g", x, f, x) 2235 } 2236 } 2237 for x := -0.9; x <= 0.90; x += 1e-2 { 2238 if f := Erfinv(Erf(x)); !close(x, f) { 2239 t.Errorf("Erfinv(Erf(%g)) = %g, want %g", x, f, x) 2240 } 2241 } 2242 } 2243 2244 func TestErfcinv(t *testing.T) { 2245 for i := 0; i < len(vf); i++ { 2246 a := 1.0 - (vf[i] / 10) 2247 if f := Erfcinv(a); !veryclose(erfinv[i], f) { 2248 t.Errorf("Erfcinv(%g) = %g, want %g", a, f, erfinv[i]) 2249 } 2250 } 2251 for i := 0; i < len(vferfcinvSC); i++ { 2252 if f := Erfcinv(vferfcinvSC[i]); !alike(erfcinvSC[i], f) { 2253 t.Errorf("Erfcinv(%g) = %g, want %g", vferfcinvSC[i], f, erfcinvSC[i]) 2254 } 2255 } 2256 for x := 0.1; x <= 1.9; x += 1e-2 { 2257 if f := Erfc(Erfcinv(x)); !close(x, f) { 2258 t.Errorf("Erfc(Erfcinv(%g)) = %g, want %g", x, f, x) 2259 } 2260 } 2261 for x := 0.1; x <= 1.9; x += 1e-2 { 2262 if f := Erfcinv(Erfc(x)); !close(x, f) { 2263 t.Errorf("Erfcinv(Erfc(%g)) = %g, want %g", x, f, x) 2264 } 2265 } 2266 } 2267 2268 func TestExp(t *testing.T) { 2269 testExp(t, Exp, "Exp") 2270 testExp(t, ExpGo, "ExpGo") 2271 } 2272 2273 func testExp(t *testing.T, Exp func(float64) float64, name string) { 2274 for i := 0; i < len(vf); i++ { 2275 if f := Exp(vf[i]); !veryclose(exp[i], f) { 2276 t.Errorf("%s(%g) = %g, want %g", name, vf[i], f, exp[i]) 2277 } 2278 } 2279 for i := 0; i < len(vfexpSC); i++ { 2280 if f := Exp(vfexpSC[i]); !alike(expSC[i], f) { 2281 t.Errorf("%s(%g) = %g, want %g", name, vfexpSC[i], f, expSC[i]) 2282 } 2283 } 2284 } 2285 2286 func TestExpm1(t *testing.T) { 2287 for i := 0; i < len(vf); i++ { 2288 a := vf[i] / 100 2289 if f := Expm1(a); !veryclose(expm1[i], f) { 2290 t.Errorf("Expm1(%g) = %g, want %g", a, f, expm1[i]) 2291 } 2292 } 2293 for i := 0; i < len(vf); i++ { 2294 a := vf[i] * 10 2295 if f := Expm1(a); !close(expm1Large[i], f) { 2296 t.Errorf("Expm1(%g) = %g, want %g", a, f, expm1Large[i]) 2297 } 2298 } 2299 for i := 0; i < len(vfexpm1SC); i++ { 2300 if f := Expm1(vfexpm1SC[i]); !alike(expm1SC[i], f) { 2301 t.Errorf("Expm1(%g) = %g, want %g", vfexpm1SC[i], f, expm1SC[i]) 2302 } 2303 } 2304 } 2305 2306 func TestExp2(t *testing.T) { 2307 testExp2(t, Exp2, "Exp2") 2308 testExp2(t, Exp2Go, "Exp2Go") 2309 } 2310 2311 func testExp2(t *testing.T, Exp2 func(float64) float64, name string) { 2312 for i := 0; i < len(vf); i++ { 2313 if f := Exp2(vf[i]); !close(exp2[i], f) { 2314 t.Errorf("%s(%g) = %g, want %g", name, vf[i], f, exp2[i]) 2315 } 2316 } 2317 for i := 0; i < len(vfexp2SC); i++ { 2318 if f := Exp2(vfexp2SC[i]); !alike(exp2SC[i], f) { 2319 t.Errorf("%s(%g) = %g, want %g", name, vfexpSC[i], f, expSC[i]) 2320 } 2321 } 2322 for n := -1074; n < 1024; n++ { 2323 f := Exp2(float64(n)) 2324 vf := Ldexp(1, n) 2325 if f != vf { 2326 t.Errorf("%s(%d) = %g, want %g", name, n, f, vf) 2327 } 2328 } 2329 } 2330 2331 func TestAbs(t *testing.T) { 2332 for i := 0; i < len(vf); i++ { 2333 if f := Abs(vf[i]); fabs[i] != f { 2334 t.Errorf("Abs(%g) = %g, want %g", vf[i], f, fabs[i]) 2335 } 2336 } 2337 for i := 0; i < len(vffabsSC); i++ { 2338 if f := Abs(vffabsSC[i]); !alike(fabsSC[i], f) { 2339 t.Errorf("Abs(%g) = %g, want %g", vffabsSC[i], f, fabsSC[i]) 2340 } 2341 } 2342 } 2343 2344 func TestDim(t *testing.T) { 2345 for i := 0; i < len(vf); i++ { 2346 if f := Dim(vf[i], 0); fdim[i] != f { 2347 t.Errorf("Dim(%g, %g) = %g, want %g", vf[i], 0.0, f, fdim[i]) 2348 } 2349 } 2350 for i := 0; i < len(vffdimSC); i++ { 2351 if f := Dim(vffdimSC[i][0], vffdimSC[i][1]); !alike(fdimSC[i], f) { 2352 t.Errorf("Dim(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fdimSC[i]) 2353 } 2354 } 2355 for i := 0; i < len(vffdim2SC); i++ { 2356 if f := Dim(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fdimSC[i], f) { 2357 t.Errorf("Dim(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fdimSC[i]) 2358 } 2359 } 2360 } 2361 2362 func TestFloor(t *testing.T) { 2363 for i := 0; i < len(vf); i++ { 2364 if f := Floor(vf[i]); floor[i] != f { 2365 t.Errorf("Floor(%g) = %g, want %g", vf[i], f, floor[i]) 2366 } 2367 } 2368 for i := 0; i < len(vfceilSC); i++ { 2369 if f := Floor(vfceilSC[i]); !alike(ceilSC[i], f) { 2370 t.Errorf("Floor(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i]) 2371 } 2372 } 2373 } 2374 2375 func TestMax(t *testing.T) { 2376 for i := 0; i < len(vf); i++ { 2377 if f := Max(vf[i], ceil[i]); ceil[i] != f { 2378 t.Errorf("Max(%g, %g) = %g, want %g", vf[i], ceil[i], f, ceil[i]) 2379 } 2380 } 2381 for i := 0; i < len(vffdimSC); i++ { 2382 if f := Max(vffdimSC[i][0], vffdimSC[i][1]); !alike(fmaxSC[i], f) { 2383 t.Errorf("Max(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fmaxSC[i]) 2384 } 2385 } 2386 for i := 0; i < len(vffdim2SC); i++ { 2387 if f := Max(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fmaxSC[i], f) { 2388 t.Errorf("Max(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fmaxSC[i]) 2389 } 2390 } 2391 } 2392 2393 func TestMin(t *testing.T) { 2394 for i := 0; i < len(vf); i++ { 2395 if f := Min(vf[i], floor[i]); floor[i] != f { 2396 t.Errorf("Min(%g, %g) = %g, want %g", vf[i], floor[i], f, floor[i]) 2397 } 2398 } 2399 for i := 0; i < len(vffdimSC); i++ { 2400 if f := Min(vffdimSC[i][0], vffdimSC[i][1]); !alike(fminSC[i], f) { 2401 t.Errorf("Min(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fminSC[i]) 2402 } 2403 } 2404 for i := 0; i < len(vffdim2SC); i++ { 2405 if f := Min(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fminSC[i], f) { 2406 t.Errorf("Min(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fminSC[i]) 2407 } 2408 } 2409 } 2410 2411 func TestMod(t *testing.T) { 2412 for i := 0; i < len(vf); i++ { 2413 if f := Mod(10, vf[i]); fmod[i] != f { 2414 t.Errorf("Mod(10, %g) = %g, want %g", vf[i], f, fmod[i]) 2415 } 2416 } 2417 for i := 0; i < len(vffmodSC); i++ { 2418 if f := Mod(vffmodSC[i][0], vffmodSC[i][1]); !alike(fmodSC[i], f) { 2419 t.Errorf("Mod(%g, %g) = %g, want %g", vffmodSC[i][0], vffmodSC[i][1], f, fmodSC[i]) 2420 } 2421 } 2422 } 2423 2424 func TestFrexp(t *testing.T) { 2425 for i := 0; i < len(vf); i++ { 2426 if f, j := Frexp(vf[i]); !veryclose(frexp[i].f, f) || frexp[i].i != j { 2427 t.Errorf("Frexp(%g) = %g, %d, want %g, %d", vf[i], f, j, frexp[i].f, frexp[i].i) 2428 } 2429 } 2430 for i := 0; i < len(vffrexpSC); i++ { 2431 if f, j := Frexp(vffrexpSC[i]); !alike(frexpSC[i].f, f) || frexpSC[i].i != j { 2432 t.Errorf("Frexp(%g) = %g, %d, want %g, %d", vffrexpSC[i], f, j, frexpSC[i].f, frexpSC[i].i) 2433 } 2434 } 2435 for i := 0; i < len(vffrexpBC); i++ { 2436 if f, j := Frexp(vffrexpBC[i]); !alike(frexpBC[i].f, f) || frexpBC[i].i != j { 2437 t.Errorf("Frexp(%g) = %g, %d, want %g, %d", vffrexpBC[i], f, j, frexpBC[i].f, frexpBC[i].i) 2438 } 2439 } 2440 } 2441 2442 func TestGamma(t *testing.T) { 2443 for i := 0; i < len(vf); i++ { 2444 if f := Gamma(vf[i]); !close(gamma[i], f) { 2445 t.Errorf("Gamma(%g) = %g, want %g", vf[i], f, gamma[i]) 2446 } 2447 } 2448 for _, g := range vfgamma { 2449 f := Gamma(g[0]) 2450 var ok bool 2451 if IsNaN(g[1]) || IsInf(g[1], 0) || g[1] == 0 || f == 0 { 2452 ok = alike(g[1], f) 2453 } else if g[0] > -50 && g[0] <= 171 { 2454 ok = veryclose(g[1], f) 2455 } else { 2456 ok = close(g[1], f) 2457 } 2458 if !ok { 2459 t.Errorf("Gamma(%g) = %g, want %g", g[0], f, g[1]) 2460 } 2461 } 2462 } 2463 2464 func TestHypot(t *testing.T) { 2465 for i := 0; i < len(vf); i++ { 2466 a := Abs(1e200 * tanh[i] * Sqrt(2)) 2467 if f := Hypot(1e200*tanh[i], 1e200*tanh[i]); !veryclose(a, f) { 2468 t.Errorf("Hypot(%g, %g) = %g, want %g", 1e200*tanh[i], 1e200*tanh[i], f, a) 2469 } 2470 } 2471 for i := 0; i < len(vfhypotSC); i++ { 2472 if f := Hypot(vfhypotSC[i][0], vfhypotSC[i][1]); !alike(hypotSC[i], f) { 2473 t.Errorf("Hypot(%g, %g) = %g, want %g", vfhypotSC[i][0], vfhypotSC[i][1], f, hypotSC[i]) 2474 } 2475 } 2476 } 2477 2478 func TestHypotGo(t *testing.T) { 2479 for i := 0; i < len(vf); i++ { 2480 a := Abs(1e200 * tanh[i] * Sqrt(2)) 2481 if f := HypotGo(1e200*tanh[i], 1e200*tanh[i]); !veryclose(a, f) { 2482 t.Errorf("HypotGo(%g, %g) = %g, want %g", 1e200*tanh[i], 1e200*tanh[i], f, a) 2483 } 2484 } 2485 for i := 0; i < len(vfhypotSC); i++ { 2486 if f := HypotGo(vfhypotSC[i][0], vfhypotSC[i][1]); !alike(hypotSC[i], f) { 2487 t.Errorf("HypotGo(%g, %g) = %g, want %g", vfhypotSC[i][0], vfhypotSC[i][1], f, hypotSC[i]) 2488 } 2489 } 2490 } 2491 2492 func TestIlogb(t *testing.T) { 2493 for i := 0; i < len(vf); i++ { 2494 a := frexp[i].i - 1 // adjust because fr in the interval [, 1) 2495 if e := Ilogb(vf[i]); a != e { 2496 t.Errorf("Ilogb(%g) = %d, want %d", vf[i], e, a) 2497 } 2498 } 2499 for i := 0; i < len(vflogbSC); i++ { 2500 if e := Ilogb(vflogbSC[i]); ilogbSC[i] != e { 2501 t.Errorf("Ilogb(%g) = %d, want %d", vflogbSC[i], e, ilogbSC[i]) 2502 } 2503 } 2504 for i := 0; i < len(vffrexpBC); i++ { 2505 if e := Ilogb(vffrexpBC[i]); int(logbBC[i]) != e { 2506 t.Errorf("Ilogb(%g) = %d, want %d", vffrexpBC[i], e, int(logbBC[i])) 2507 } 2508 } 2509 } 2510 2511 func TestJ0(t *testing.T) { 2512 for i := 0; i < len(vf); i++ { 2513 if f := J0(vf[i]); !soclose(j0[i], f, 4e-14) { 2514 t.Errorf("J0(%g) = %g, want %g", vf[i], f, j0[i]) 2515 } 2516 } 2517 for i := 0; i < len(vfj0SC); i++ { 2518 if f := J0(vfj0SC[i]); !alike(j0SC[i], f) { 2519 t.Errorf("J0(%g) = %g, want %g", vfj0SC[i], f, j0SC[i]) 2520 } 2521 } 2522 } 2523 2524 func TestJ1(t *testing.T) { 2525 for i := 0; i < len(vf); i++ { 2526 if f := J1(vf[i]); !close(j1[i], f) { 2527 t.Errorf("J1(%g) = %g, want %g", vf[i], f, j1[i]) 2528 } 2529 } 2530 for i := 0; i < len(vfj0SC); i++ { 2531 if f := J1(vfj0SC[i]); !alike(j1SC[i], f) { 2532 t.Errorf("J1(%g) = %g, want %g", vfj0SC[i], f, j1SC[i]) 2533 } 2534 } 2535 } 2536 2537 func TestJn(t *testing.T) { 2538 for i := 0; i < len(vf); i++ { 2539 if f := Jn(2, vf[i]); !close(j2[i], f) { 2540 t.Errorf("Jn(2, %g) = %g, want %g", vf[i], f, j2[i]) 2541 } 2542 if f := Jn(-3, vf[i]); !close(jM3[i], f) { 2543 t.Errorf("Jn(-3, %g) = %g, want %g", vf[i], f, jM3[i]) 2544 } 2545 } 2546 for i := 0; i < len(vfj0SC); i++ { 2547 if f := Jn(2, vfj0SC[i]); !alike(j2SC[i], f) { 2548 t.Errorf("Jn(2, %g) = %g, want %g", vfj0SC[i], f, j2SC[i]) 2549 } 2550 if f := Jn(-3, vfj0SC[i]); !alike(jM3SC[i], f) { 2551 t.Errorf("Jn(-3, %g) = %g, want %g", vfj0SC[i], f, jM3SC[i]) 2552 } 2553 } 2554 } 2555 2556 func TestLdexp(t *testing.T) { 2557 for i := 0; i < len(vf); i++ { 2558 if f := Ldexp(frexp[i].f, frexp[i].i); !veryclose(vf[i], f) { 2559 t.Errorf("Ldexp(%g, %d) = %g, want %g", frexp[i].f, frexp[i].i, f, vf[i]) 2560 } 2561 } 2562 for i := 0; i < len(vffrexpSC); i++ { 2563 if f := Ldexp(frexpSC[i].f, frexpSC[i].i); !alike(vffrexpSC[i], f) { 2564 t.Errorf("Ldexp(%g, %d) = %g, want %g", frexpSC[i].f, frexpSC[i].i, f, vffrexpSC[i]) 2565 } 2566 } 2567 for i := 0; i < len(vfldexpSC); i++ { 2568 if f := Ldexp(vfldexpSC[i].f, vfldexpSC[i].i); !alike(ldexpSC[i], f) { 2569 t.Errorf("Ldexp(%g, %d) = %g, want %g", vfldexpSC[i].f, vfldexpSC[i].i, f, ldexpSC[i]) 2570 } 2571 } 2572 for i := 0; i < len(vffrexpBC); i++ { 2573 if f := Ldexp(frexpBC[i].f, frexpBC[i].i); !alike(vffrexpBC[i], f) { 2574 t.Errorf("Ldexp(%g, %d) = %g, want %g", frexpBC[i].f, frexpBC[i].i, f, vffrexpBC[i]) 2575 } 2576 } 2577 for i := 0; i < len(vfldexpBC); i++ { 2578 if f := Ldexp(vfldexpBC[i].f, vfldexpBC[i].i); !alike(ldexpBC[i], f) { 2579 t.Errorf("Ldexp(%g, %d) = %g, want %g", vfldexpBC[i].f, vfldexpBC[i].i, f, ldexpBC[i]) 2580 } 2581 } 2582 } 2583 2584 func TestLgamma(t *testing.T) { 2585 for i := 0; i < len(vf); i++ { 2586 if f, s := Lgamma(vf[i]); !close(lgamma[i].f, f) || lgamma[i].i != s { 2587 t.Errorf("Lgamma(%g) = %g, %d, want %g, %d", vf[i], f, s, lgamma[i].f, lgamma[i].i) 2588 } 2589 } 2590 for i := 0; i < len(vflgammaSC); i++ { 2591 if f, s := Lgamma(vflgammaSC[i]); !alike(lgammaSC[i].f, f) || lgammaSC[i].i != s { 2592 t.Errorf("Lgamma(%g) = %g, %d, want %g, %d", vflgammaSC[i], f, s, lgammaSC[i].f, lgammaSC[i].i) 2593 } 2594 } 2595 } 2596 2597 func TestLog(t *testing.T) { 2598 for i := 0; i < len(vf); i++ { 2599 a := Abs(vf[i]) 2600 if f := Log(a); log[i] != f { 2601 t.Errorf("Log(%g) = %g, want %g", a, f, log[i]) 2602 } 2603 } 2604 if f := Log(10); f != Ln10 { 2605 t.Errorf("Log(%g) = %g, want %g", 10.0, f, Ln10) 2606 } 2607 for i := 0; i < len(vflogSC); i++ { 2608 if f := Log(vflogSC[i]); !alike(logSC[i], f) { 2609 t.Errorf("Log(%g) = %g, want %g", vflogSC[i], f, logSC[i]) 2610 } 2611 } 2612 } 2613 2614 func TestLogb(t *testing.T) { 2615 for i := 0; i < len(vf); i++ { 2616 if f := Logb(vf[i]); logb[i] != f { 2617 t.Errorf("Logb(%g) = %g, want %g", vf[i], f, logb[i]) 2618 } 2619 } 2620 for i := 0; i < len(vflogbSC); i++ { 2621 if f := Logb(vflogbSC[i]); !alike(logbSC[i], f) { 2622 t.Errorf("Logb(%g) = %g, want %g", vflogbSC[i], f, logbSC[i]) 2623 } 2624 } 2625 for i := 0; i < len(vffrexpBC); i++ { 2626 if f := Logb(vffrexpBC[i]); !alike(logbBC[i], f) { 2627 t.Errorf("Logb(%g) = %g, want %g", vffrexpBC[i], f, logbBC[i]) 2628 } 2629 } 2630 } 2631 2632 func TestLog10(t *testing.T) { 2633 for i := 0; i < len(vf); i++ { 2634 a := Abs(vf[i]) 2635 if f := Log10(a); !veryclose(log10[i], f) { 2636 t.Errorf("Log10(%g) = %g, want %g", a, f, log10[i]) 2637 } 2638 } 2639 if f := Log10(E); f != Log10E { 2640 t.Errorf("Log10(%g) = %g, want %g", E, f, Log10E) 2641 } 2642 for i := 0; i < len(vflogSC); i++ { 2643 if f := Log10(vflogSC[i]); !alike(logSC[i], f) { 2644 t.Errorf("Log10(%g) = %g, want %g", vflogSC[i], f, logSC[i]) 2645 } 2646 } 2647 } 2648 2649 func TestLog1p(t *testing.T) { 2650 for i := 0; i < len(vf); i++ { 2651 a := vf[i] / 100 2652 if f := Log1p(a); !veryclose(log1p[i], f) { 2653 t.Errorf("Log1p(%g) = %g, want %g", a, f, log1p[i]) 2654 } 2655 } 2656 a := 9.0 2657 if f := Log1p(a); f != Ln10 { 2658 t.Errorf("Log1p(%g) = %g, want %g", a, f, Ln10) 2659 } 2660 for i := 0; i < len(vflogSC); i++ { 2661 if f := Log1p(vflog1pSC[i]); !alike(log1pSC[i], f) { 2662 t.Errorf("Log1p(%g) = %g, want %g", vflog1pSC[i], f, log1pSC[i]) 2663 } 2664 } 2665 } 2666 2667 func TestLog2(t *testing.T) { 2668 for i := 0; i < len(vf); i++ { 2669 a := Abs(vf[i]) 2670 if f := Log2(a); !veryclose(log2[i], f) { 2671 t.Errorf("Log2(%g) = %g, want %g", a, f, log2[i]) 2672 } 2673 } 2674 if f := Log2(E); f != Log2E { 2675 t.Errorf("Log2(%g) = %g, want %g", E, f, Log2E) 2676 } 2677 for i := 0; i < len(vflogSC); i++ { 2678 if f := Log2(vflogSC[i]); !alike(logSC[i], f) { 2679 t.Errorf("Log2(%g) = %g, want %g", vflogSC[i], f, logSC[i]) 2680 } 2681 } 2682 for i := -1074; i <= 1023; i++ { 2683 f := Ldexp(1, i) 2684 l := Log2(f) 2685 if l != float64(i) { 2686 t.Errorf("Log2(2**%d) = %g, want %d", i, l, i) 2687 } 2688 } 2689 } 2690 2691 func TestModf(t *testing.T) { 2692 for i := 0; i < len(vf); i++ { 2693 if f, g := Modf(vf[i]); !veryclose(modf[i][0], f) || !veryclose(modf[i][1], g) { 2694 t.Errorf("Modf(%g) = %g, %g, want %g, %g", vf[i], f, g, modf[i][0], modf[i][1]) 2695 } 2696 } 2697 for i := 0; i < len(vfmodfSC); i++ { 2698 if f, g := Modf(vfmodfSC[i]); !alike(modfSC[i][0], f) || !alike(modfSC[i][1], g) { 2699 t.Errorf("Modf(%g) = %g, %g, want %g, %g", vfmodfSC[i], f, g, modfSC[i][0], modfSC[i][1]) 2700 } 2701 } 2702 } 2703 2704 func TestNextafter32(t *testing.T) { 2705 for i := 0; i < len(vf); i++ { 2706 vfi := float32(vf[i]) 2707 if f := Nextafter32(vfi, 10); nextafter32[i] != f { 2708 t.Errorf("Nextafter32(%g, %g) = %g want %g", vfi, 10.0, f, nextafter32[i]) 2709 } 2710 } 2711 for i := 0; i < len(vfnextafter32SC); i++ { 2712 if f := Nextafter32(vfnextafter32SC[i][0], vfnextafter32SC[i][1]); !alike(float64(nextafter32SC[i]), float64(f)) { 2713 t.Errorf("Nextafter32(%g, %g) = %g want %g", vfnextafter32SC[i][0], vfnextafter32SC[i][1], f, nextafter32SC[i]) 2714 } 2715 } 2716 } 2717 2718 func TestNextafter64(t *testing.T) { 2719 for i := 0; i < len(vf); i++ { 2720 if f := Nextafter(vf[i], 10); nextafter64[i] != f { 2721 t.Errorf("Nextafter64(%g, %g) = %g want %g", vf[i], 10.0, f, nextafter64[i]) 2722 } 2723 } 2724 for i := 0; i < len(vfnextafter64SC); i++ { 2725 if f := Nextafter(vfnextafter64SC[i][0], vfnextafter64SC[i][1]); !alike(nextafter64SC[i], f) { 2726 t.Errorf("Nextafter64(%g, %g) = %g want %g", vfnextafter64SC[i][0], vfnextafter64SC[i][1], f, nextafter64SC[i]) 2727 } 2728 } 2729 } 2730 2731 func TestPow(t *testing.T) { 2732 for i := 0; i < len(vf); i++ { 2733 if f := Pow(10, vf[i]); !close(pow[i], f) { 2734 t.Errorf("Pow(10, %g) = %g, want %g", vf[i], f, pow[i]) 2735 } 2736 } 2737 for i := 0; i < len(vfpowSC); i++ { 2738 if f := Pow(vfpowSC[i][0], vfpowSC[i][1]); !alike(powSC[i], f) { 2739 t.Errorf("Pow(%g, %g) = %g, want %g", vfpowSC[i][0], vfpowSC[i][1], f, powSC[i]) 2740 } 2741 } 2742 } 2743 2744 func TestPow10(t *testing.T) { 2745 for i := 0; i < len(vfpow10SC); i++ { 2746 if f := Pow10(vfpow10SC[i]); !alike(pow10SC[i], f) { 2747 t.Errorf("Pow10(%d) = %g, want %g", vfpow10SC[i], f, pow10SC[i]) 2748 } 2749 } 2750 } 2751 2752 func TestRemainder(t *testing.T) { 2753 for i := 0; i < len(vf); i++ { 2754 if f := Remainder(10, vf[i]); remainder[i] != f { 2755 t.Errorf("Remainder(10, %g) = %g, want %g", vf[i], f, remainder[i]) 2756 } 2757 } 2758 for i := 0; i < len(vffmodSC); i++ { 2759 if f := Remainder(vffmodSC[i][0], vffmodSC[i][1]); !alike(fmodSC[i], f) { 2760 t.Errorf("Remainder(%g, %g) = %g, want %g", vffmodSC[i][0], vffmodSC[i][1], f, fmodSC[i]) 2761 } 2762 } 2763 } 2764 2765 func TestRound(t *testing.T) { 2766 for i := 0; i < len(vf); i++ { 2767 if f := Round(vf[i]); !alike(round[i], f) { 2768 t.Errorf("Round(%g) = %g, want %g", vf[i], f, round[i]) 2769 } 2770 } 2771 for i := 0; i < len(vfroundSC); i++ { 2772 if f := Round(vfroundSC[i][0]); !alike(vfroundSC[i][1], f) { 2773 t.Errorf("Round(%g) = %g, want %g", vfroundSC[i][0], f, vfroundSC[i][1]) 2774 } 2775 } 2776 } 2777 2778 func TestRoundToEven(t *testing.T) { 2779 for i := 0; i < len(vf); i++ { 2780 if f := RoundToEven(vf[i]); !alike(round[i], f) { 2781 t.Errorf("RoundToEven(%g) = %g, want %g", vf[i], f, round[i]) 2782 } 2783 } 2784 for i := 0; i < len(vfroundEvenSC); i++ { 2785 if f := RoundToEven(vfroundEvenSC[i][0]); !alike(vfroundEvenSC[i][1], f) { 2786 t.Errorf("RoundToEven(%g) = %g, want %g", vfroundEvenSC[i][0], f, vfroundEvenSC[i][1]) 2787 } 2788 } 2789 } 2790 2791 func TestSignbit(t *testing.T) { 2792 for i := 0; i < len(vf); i++ { 2793 if f := Signbit(vf[i]); signbit[i] != f { 2794 t.Errorf("Signbit(%g) = %t, want %t", vf[i], f, signbit[i]) 2795 } 2796 } 2797 for i := 0; i < len(vfsignbitSC); i++ { 2798 if f := Signbit(vfsignbitSC[i]); signbitSC[i] != f { 2799 t.Errorf("Signbit(%g) = %t, want %t", vfsignbitSC[i], f, signbitSC[i]) 2800 } 2801 } 2802 } 2803 func TestSin(t *testing.T) { 2804 for i := 0; i < len(vf); i++ { 2805 if f := Sin(vf[i]); !veryclose(sin[i], f) { 2806 t.Errorf("Sin(%g) = %g, want %g", vf[i], f, sin[i]) 2807 } 2808 } 2809 for i := 0; i < len(vfsinSC); i++ { 2810 if f := Sin(vfsinSC[i]); !alike(sinSC[i], f) { 2811 t.Errorf("Sin(%g) = %g, want %g", vfsinSC[i], f, sinSC[i]) 2812 } 2813 } 2814 } 2815 2816 func TestSincos(t *testing.T) { 2817 for i := 0; i < len(vf); i++ { 2818 if s, c := Sincos(vf[i]); !veryclose(sin[i], s) || !veryclose(cos[i], c) { 2819 t.Errorf("Sincos(%g) = %g, %g want %g, %g", vf[i], s, c, sin[i], cos[i]) 2820 } 2821 } 2822 } 2823 2824 func TestSinh(t *testing.T) { 2825 for i := 0; i < len(vf); i++ { 2826 if f := Sinh(vf[i]); !close(sinh[i], f) { 2827 t.Errorf("Sinh(%g) = %g, want %g", vf[i], f, sinh[i]) 2828 } 2829 } 2830 for i := 0; i < len(vfsinhSC); i++ { 2831 if f := Sinh(vfsinhSC[i]); !alike(sinhSC[i], f) { 2832 t.Errorf("Sinh(%g) = %g, want %g", vfsinhSC[i], f, sinhSC[i]) 2833 } 2834 } 2835 } 2836 2837 func TestSqrt(t *testing.T) { 2838 for i := 0; i < len(vf); i++ { 2839 a := Abs(vf[i]) 2840 if f := SqrtGo(a); sqrt[i] != f { 2841 t.Errorf("SqrtGo(%g) = %g, want %g", a, f, sqrt[i]) 2842 } 2843 a = Abs(vf[i]) 2844 if f := Sqrt(a); sqrt[i] != f { 2845 t.Errorf("Sqrt(%g) = %g, want %g", a, f, sqrt[i]) 2846 } 2847 } 2848 for i := 0; i < len(vfsqrtSC); i++ { 2849 if f := SqrtGo(vfsqrtSC[i]); !alike(sqrtSC[i], f) { 2850 t.Errorf("SqrtGo(%g) = %g, want %g", vfsqrtSC[i], f, sqrtSC[i]) 2851 } 2852 if f := Sqrt(vfsqrtSC[i]); !alike(sqrtSC[i], f) { 2853 t.Errorf("Sqrt(%g) = %g, want %g", vfsqrtSC[i], f, sqrtSC[i]) 2854 } 2855 } 2856 } 2857 2858 func TestTan(t *testing.T) { 2859 for i := 0; i < len(vf); i++ { 2860 if f := Tan(vf[i]); !veryclose(tan[i], f) { 2861 t.Errorf("Tan(%g) = %g, want %g", vf[i], f, tan[i]) 2862 } 2863 } 2864 // same special cases as Sin 2865 for i := 0; i < len(vfsinSC); i++ { 2866 if f := Tan(vfsinSC[i]); !alike(sinSC[i], f) { 2867 t.Errorf("Tan(%g) = %g, want %g", vfsinSC[i], f, sinSC[i]) 2868 } 2869 } 2870 } 2871 2872 func TestTanh(t *testing.T) { 2873 for i := 0; i < len(vf); i++ { 2874 if f := Tanh(vf[i]); !veryclose(tanh[i], f) { 2875 t.Errorf("Tanh(%g) = %g, want %g", vf[i], f, tanh[i]) 2876 } 2877 } 2878 for i := 0; i < len(vftanhSC); i++ { 2879 if f := Tanh(vftanhSC[i]); !alike(tanhSC[i], f) { 2880 t.Errorf("Tanh(%g) = %g, want %g", vftanhSC[i], f, tanhSC[i]) 2881 } 2882 } 2883 } 2884 2885 func TestTrunc(t *testing.T) { 2886 for i := 0; i < len(vf); i++ { 2887 if f := Trunc(vf[i]); trunc[i] != f { 2888 t.Errorf("Trunc(%g) = %g, want %g", vf[i], f, trunc[i]) 2889 } 2890 } 2891 for i := 0; i < len(vfceilSC); i++ { 2892 if f := Trunc(vfceilSC[i]); !alike(ceilSC[i], f) { 2893 t.Errorf("Trunc(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i]) 2894 } 2895 } 2896 } 2897 2898 func TestY0(t *testing.T) { 2899 for i := 0; i < len(vf); i++ { 2900 a := Abs(vf[i]) 2901 if f := Y0(a); !close(y0[i], f) { 2902 t.Errorf("Y0(%g) = %g, want %g", a, f, y0[i]) 2903 } 2904 } 2905 for i := 0; i < len(vfy0SC); i++ { 2906 if f := Y0(vfy0SC[i]); !alike(y0SC[i], f) { 2907 t.Errorf("Y0(%g) = %g, want %g", vfy0SC[i], f, y0SC[i]) 2908 } 2909 } 2910 } 2911 2912 func TestY1(t *testing.T) { 2913 for i := 0; i < len(vf); i++ { 2914 a := Abs(vf[i]) 2915 if f := Y1(a); !soclose(y1[i], f, 2e-14) { 2916 t.Errorf("Y1(%g) = %g, want %g", a, f, y1[i]) 2917 } 2918 } 2919 for i := 0; i < len(vfy0SC); i++ { 2920 if f := Y1(vfy0SC[i]); !alike(y1SC[i], f) { 2921 t.Errorf("Y1(%g) = %g, want %g", vfy0SC[i], f, y1SC[i]) 2922 } 2923 } 2924 } 2925 2926 func TestYn(t *testing.T) { 2927 for i := 0; i < len(vf); i++ { 2928 a := Abs(vf[i]) 2929 if f := Yn(2, a); !close(y2[i], f) { 2930 t.Errorf("Yn(2, %g) = %g, want %g", a, f, y2[i]) 2931 } 2932 if f := Yn(-3, a); !close(yM3[i], f) { 2933 t.Errorf("Yn(-3, %g) = %g, want %g", a, f, yM3[i]) 2934 } 2935 } 2936 for i := 0; i < len(vfy0SC); i++ { 2937 if f := Yn(2, vfy0SC[i]); !alike(y2SC[i], f) { 2938 t.Errorf("Yn(2, %g) = %g, want %g", vfy0SC[i], f, y2SC[i]) 2939 } 2940 if f := Yn(-3, vfy0SC[i]); !alike(yM3SC[i], f) { 2941 t.Errorf("Yn(-3, %g) = %g, want %g", vfy0SC[i], f, yM3SC[i]) 2942 } 2943 } 2944 if f := Yn(0, 0); !alike(Inf(-1), f) { 2945 t.Errorf("Yn(0, 0) = %g, want %g", f, Inf(-1)) 2946 } 2947 } 2948 2949 // Check that math functions of high angle values 2950 // return accurate results. [Since (vf[i] + large) - large != vf[i], 2951 // testing for Trig(vf[i] + large) == Trig(vf[i]), where large is 2952 // a multiple of 2*Pi, is misleading.] 2953 func TestLargeCos(t *testing.T) { 2954 large := float64(100000 * Pi) 2955 for i := 0; i < len(vf); i++ { 2956 f1 := cosLarge[i] 2957 f2 := Cos(vf[i] + large) 2958 if !close(f1, f2) { 2959 t.Errorf("Cos(%g) = %g, want %g", vf[i]+large, f2, f1) 2960 } 2961 } 2962 } 2963 2964 func TestLargeSin(t *testing.T) { 2965 large := float64(100000 * Pi) 2966 for i := 0; i < len(vf); i++ { 2967 f1 := sinLarge[i] 2968 f2 := Sin(vf[i] + large) 2969 if !close(f1, f2) { 2970 t.Errorf("Sin(%g) = %g, want %g", vf[i]+large, f2, f1) 2971 } 2972 } 2973 } 2974 2975 func TestLargeSincos(t *testing.T) { 2976 large := float64(100000 * Pi) 2977 for i := 0; i < len(vf); i++ { 2978 f1, g1 := sinLarge[i], cosLarge[i] 2979 f2, g2 := Sincos(vf[i] + large) 2980 if !close(f1, f2) || !close(g1, g2) { 2981 t.Errorf("Sincos(%g) = %g, %g, want %g, %g", vf[i]+large, f2, g2, f1, g1) 2982 } 2983 } 2984 } 2985 2986 func TestLargeTan(t *testing.T) { 2987 large := float64(100000 * Pi) 2988 for i := 0; i < len(vf); i++ { 2989 f1 := tanLarge[i] 2990 f2 := Tan(vf[i] + large) 2991 if !close(f1, f2) { 2992 t.Errorf("Tan(%g) = %g, want %g", vf[i]+large, f2, f1) 2993 } 2994 } 2995 } 2996 2997 // Check that math constants are accepted by compiler 2998 // and have right value (assumes strconv.ParseFloat works). 2999 // https://golang.org/issue/201 3000 3001 type floatTest struct { 3002 val interface{} 3003 name string 3004 str string 3005 } 3006 3007 var floatTests = []floatTest{ 3008 {float64(MaxFloat64), "MaxFloat64", "1.7976931348623157e+308"}, 3009 {float64(SmallestNonzeroFloat64), "SmallestNonzeroFloat64", "5e-324"}, 3010 {float32(MaxFloat32), "MaxFloat32", "3.4028235e+38"}, 3011 {float32(SmallestNonzeroFloat32), "SmallestNonzeroFloat32", "1e-45"}, 3012 } 3013 3014 func TestFloatMinMax(t *testing.T) { 3015 for _, tt := range floatTests { 3016 s := fmt.Sprint(tt.val) 3017 if s != tt.str { 3018 t.Errorf("Sprint(%v) = %s, want %s", tt.name, s, tt.str) 3019 } 3020 } 3021 } 3022 3023 // Benchmarks 3024 3025 // Global exported variables are used to store the 3026 // return values of functions measured in the benchmarks. 3027 // Storing the results in these variables prevents the compiler 3028 // from completely optimizing the benchmarked functions away. 3029 var ( 3030 GlobalI int 3031 GlobalB bool 3032 GlobalF float64 3033 ) 3034 3035 func BenchmarkAcos(b *testing.B) { 3036 x := 0.0 3037 for i := 0; i < b.N; i++ { 3038 x = Acos(.5) 3039 } 3040 GlobalF = x 3041 } 3042 3043 func BenchmarkAcosh(b *testing.B) { 3044 x := 0.0 3045 for i := 0; i < b.N; i++ { 3046 x = Acosh(1.5) 3047 } 3048 GlobalF = x 3049 } 3050 3051 func BenchmarkAsin(b *testing.B) { 3052 x := 0.0 3053 for i := 0; i < b.N; i++ { 3054 x = Asin(.5) 3055 } 3056 GlobalF = x 3057 } 3058 3059 func BenchmarkAsinh(b *testing.B) { 3060 x := 0.0 3061 for i := 0; i < b.N; i++ { 3062 x = Asinh(.5) 3063 } 3064 GlobalF = x 3065 } 3066 3067 func BenchmarkAtan(b *testing.B) { 3068 x := 0.0 3069 for i := 0; i < b.N; i++ { 3070 x = Atan(.5) 3071 } 3072 GlobalF = x 3073 } 3074 3075 func BenchmarkAtanh(b *testing.B) { 3076 x := 0.0 3077 for i := 0; i < b.N; i++ { 3078 x = Atanh(.5) 3079 } 3080 GlobalF = x 3081 } 3082 3083 func BenchmarkAtan2(b *testing.B) { 3084 x := 0.0 3085 for i := 0; i < b.N; i++ { 3086 x = Atan2(.5, 1) 3087 } 3088 GlobalF = x 3089 } 3090 3091 func BenchmarkCbrt(b *testing.B) { 3092 x := 0.0 3093 for i := 0; i < b.N; i++ { 3094 x = Cbrt(10) 3095 } 3096 GlobalF = x 3097 } 3098 3099 func BenchmarkCeil(b *testing.B) { 3100 x := 0.0 3101 for i := 0; i < b.N; i++ { 3102 x = Ceil(.5) 3103 } 3104 GlobalF = x 3105 } 3106 3107 var copysignNeg = -1.0 3108 3109 func BenchmarkCopysign(b *testing.B) { 3110 x := 0.0 3111 for i := 0; i < b.N; i++ { 3112 x = Copysign(.5, copysignNeg) 3113 } 3114 GlobalF = x 3115 } 3116 3117 func BenchmarkCos(b *testing.B) { 3118 x := 0.0 3119 for i := 0; i < b.N; i++ { 3120 x = Cos(.5) 3121 } 3122 GlobalF = x 3123 } 3124 3125 func BenchmarkCosh(b *testing.B) { 3126 x := 0.0 3127 for i := 0; i < b.N; i++ { 3128 x = Cosh(2.5) 3129 } 3130 GlobalF = x 3131 } 3132 3133 func BenchmarkErf(b *testing.B) { 3134 x := 0.0 3135 for i := 0; i < b.N; i++ { 3136 x = Erf(.5) 3137 } 3138 GlobalF = x 3139 } 3140 3141 func BenchmarkErfc(b *testing.B) { 3142 x := 0.0 3143 for i := 0; i < b.N; i++ { 3144 x = Erfc(.5) 3145 } 3146 GlobalF = x 3147 } 3148 3149 func BenchmarkErfinv(b *testing.B) { 3150 x := 0.0 3151 for i := 0; i < b.N; i++ { 3152 x = Erfinv(.5) 3153 } 3154 GlobalF = x 3155 } 3156 3157 func BenchmarkErfcinv(b *testing.B) { 3158 x := 0.0 3159 for i := 0; i < b.N; i++ { 3160 x = Erfcinv(.5) 3161 } 3162 GlobalF = x 3163 } 3164 3165 func BenchmarkExp(b *testing.B) { 3166 x := 0.0 3167 for i := 0; i < b.N; i++ { 3168 x = Exp(.5) 3169 } 3170 GlobalF = x 3171 } 3172 3173 func BenchmarkExpGo(b *testing.B) { 3174 x := 0.0 3175 for i := 0; i < b.N; i++ { 3176 x = ExpGo(.5) 3177 } 3178 GlobalF = x 3179 } 3180 3181 func BenchmarkExpm1(b *testing.B) { 3182 x := 0.0 3183 for i := 0; i < b.N; i++ { 3184 x = Expm1(.5) 3185 } 3186 GlobalF = x 3187 } 3188 3189 func BenchmarkExp2(b *testing.B) { 3190 x := 0.0 3191 for i := 0; i < b.N; i++ { 3192 x = Exp2(.5) 3193 } 3194 GlobalF = x 3195 } 3196 3197 func BenchmarkExp2Go(b *testing.B) { 3198 x := 0.0 3199 for i := 0; i < b.N; i++ { 3200 x = Exp2Go(.5) 3201 } 3202 GlobalF = x 3203 } 3204 3205 var absPos = .5 3206 3207 func BenchmarkAbs(b *testing.B) { 3208 x := 0.0 3209 for i := 0; i < b.N; i++ { 3210 x = Abs(absPos) 3211 } 3212 GlobalF = x 3213 3214 } 3215 3216 func BenchmarkDim(b *testing.B) { 3217 x := 0.0 3218 for i := 0; i < b.N; i++ { 3219 x = Dim(GlobalF, x) 3220 } 3221 GlobalF = x 3222 } 3223 3224 func BenchmarkFloor(b *testing.B) { 3225 x := 0.0 3226 for i := 0; i < b.N; i++ { 3227 x = Floor(.5) 3228 } 3229 GlobalF = x 3230 } 3231 3232 func BenchmarkMax(b *testing.B) { 3233 x := 0.0 3234 for i := 0; i < b.N; i++ { 3235 x = Max(10, 3) 3236 } 3237 GlobalF = x 3238 } 3239 3240 func BenchmarkMin(b *testing.B) { 3241 x := 0.0 3242 for i := 0; i < b.N; i++ { 3243 x = Min(10, 3) 3244 } 3245 GlobalF = x 3246 } 3247 3248 func BenchmarkMod(b *testing.B) { 3249 x := 0.0 3250 for i := 0; i < b.N; i++ { 3251 x = Mod(10, 3) 3252 } 3253 GlobalF = x 3254 } 3255 3256 func BenchmarkFrexp(b *testing.B) { 3257 x := 0.0 3258 y := 0 3259 for i := 0; i < b.N; i++ { 3260 x, y = Frexp(8) 3261 } 3262 GlobalF = x 3263 GlobalI = y 3264 } 3265 3266 func BenchmarkGamma(b *testing.B) { 3267 x := 0.0 3268 for i := 0; i < b.N; i++ { 3269 x = Gamma(2.5) 3270 } 3271 GlobalF = x 3272 } 3273 3274 func BenchmarkHypot(b *testing.B) { 3275 x := 0.0 3276 for i := 0; i < b.N; i++ { 3277 x = Hypot(3, 4) 3278 } 3279 GlobalF = x 3280 } 3281 3282 func BenchmarkHypotGo(b *testing.B) { 3283 x := 0.0 3284 for i := 0; i < b.N; i++ { 3285 x = HypotGo(3, 4) 3286 } 3287 GlobalF = x 3288 } 3289 3290 func BenchmarkIlogb(b *testing.B) { 3291 x := 0 3292 for i := 0; i < b.N; i++ { 3293 x = Ilogb(.5) 3294 } 3295 GlobalI = x 3296 } 3297 3298 func BenchmarkJ0(b *testing.B) { 3299 x := 0.0 3300 for i := 0; i < b.N; i++ { 3301 x = J0(2.5) 3302 } 3303 GlobalF = x 3304 } 3305 3306 func BenchmarkJ1(b *testing.B) { 3307 x := 0.0 3308 for i := 0; i < b.N; i++ { 3309 x = J1(2.5) 3310 } 3311 GlobalF = x 3312 } 3313 3314 func BenchmarkJn(b *testing.B) { 3315 x := 0.0 3316 for i := 0; i < b.N; i++ { 3317 x = Jn(2, 2.5) 3318 } 3319 GlobalF = x 3320 } 3321 3322 func BenchmarkLdexp(b *testing.B) { 3323 x := 0.0 3324 for i := 0; i < b.N; i++ { 3325 x = Ldexp(.5, 2) 3326 } 3327 GlobalF = x 3328 } 3329 3330 func BenchmarkLgamma(b *testing.B) { 3331 x := 0.0 3332 y := 0 3333 for i := 0; i < b.N; i++ { 3334 x, y = Lgamma(2.5) 3335 } 3336 GlobalF = x 3337 GlobalI = y 3338 } 3339 3340 func BenchmarkLog(b *testing.B) { 3341 x := 0.0 3342 for i := 0; i < b.N; i++ { 3343 x = Log(.5) 3344 } 3345 GlobalF = x 3346 } 3347 3348 func BenchmarkLogb(b *testing.B) { 3349 x := 0.0 3350 for i := 0; i < b.N; i++ { 3351 x = Logb(.5) 3352 } 3353 GlobalF = x 3354 } 3355 3356 func BenchmarkLog1p(b *testing.B) { 3357 x := 0.0 3358 for i := 0; i < b.N; i++ { 3359 x = Log1p(.5) 3360 } 3361 GlobalF = x 3362 } 3363 3364 func BenchmarkLog10(b *testing.B) { 3365 x := 0.0 3366 for i := 0; i < b.N; i++ { 3367 x = Log10(.5) 3368 } 3369 GlobalF = x 3370 } 3371 3372 func BenchmarkLog2(b *testing.B) { 3373 x := 0.0 3374 for i := 0; i < b.N; i++ { 3375 x = Log2(.5) 3376 } 3377 GlobalF += x 3378 } 3379 3380 func BenchmarkModf(b *testing.B) { 3381 x := 0.0 3382 y := 0.0 3383 for i := 0; i < b.N; i++ { 3384 x, y = Modf(1.5) 3385 } 3386 GlobalF += x 3387 GlobalF += y 3388 } 3389 3390 func BenchmarkNextafter32(b *testing.B) { 3391 x := float32(0.0) 3392 for i := 0; i < b.N; i++ { 3393 x = Nextafter32(.5, 1) 3394 } 3395 GlobalF = float64(x) 3396 } 3397 3398 func BenchmarkNextafter64(b *testing.B) { 3399 x := 0.0 3400 for i := 0; i < b.N; i++ { 3401 x = Nextafter(.5, 1) 3402 } 3403 GlobalF = x 3404 } 3405 3406 func BenchmarkPowInt(b *testing.B) { 3407 x := 0.0 3408 for i := 0; i < b.N; i++ { 3409 x = Pow(2, 2) 3410 } 3411 GlobalF = x 3412 } 3413 3414 func BenchmarkPowFrac(b *testing.B) { 3415 x := 0.0 3416 for i := 0; i < b.N; i++ { 3417 x = Pow(2.5, 1.5) 3418 } 3419 GlobalF = x 3420 } 3421 3422 var pow10pos = int(300) 3423 3424 func BenchmarkPow10Pos(b *testing.B) { 3425 x := 0.0 3426 for i := 0; i < b.N; i++ { 3427 x = Pow10(pow10pos) 3428 } 3429 GlobalF = x 3430 } 3431 3432 var pow10neg = int(-300) 3433 3434 func BenchmarkPow10Neg(b *testing.B) { 3435 x := 0.0 3436 for i := 0; i < b.N; i++ { 3437 x = Pow10(pow10neg) 3438 } 3439 GlobalF = x 3440 } 3441 3442 var roundNeg = float64(-2.5) 3443 3444 func BenchmarkRound(b *testing.B) { 3445 x := 0.0 3446 for i := 0; i < b.N; i++ { 3447 x = Round(roundNeg) 3448 } 3449 GlobalF = x 3450 } 3451 3452 func BenchmarkRoundToEven(b *testing.B) { 3453 x := 0.0 3454 for i := 0; i < b.N; i++ { 3455 x = RoundToEven(roundNeg) 3456 } 3457 GlobalF = x 3458 } 3459 3460 func BenchmarkRemainder(b *testing.B) { 3461 x := 0.0 3462 for i := 0; i < b.N; i++ { 3463 x = Remainder(10, 3) 3464 } 3465 GlobalF = x 3466 } 3467 3468 var signbitPos = 2.5 3469 3470 func BenchmarkSignbit(b *testing.B) { 3471 x := false 3472 for i := 0; i < b.N; i++ { 3473 x = Signbit(signbitPos) 3474 } 3475 GlobalB = x 3476 } 3477 3478 func BenchmarkSin(b *testing.B) { 3479 x := 0.0 3480 for i := 0; i < b.N; i++ { 3481 x = Sin(.5) 3482 } 3483 GlobalF = x 3484 } 3485 3486 func BenchmarkSincos(b *testing.B) { 3487 x := 0.0 3488 y := 0.0 3489 for i := 0; i < b.N; i++ { 3490 x, y = Sincos(.5) 3491 } 3492 GlobalF += x 3493 GlobalF += y 3494 } 3495 3496 func BenchmarkSinh(b *testing.B) { 3497 x := 0.0 3498 for i := 0; i < b.N; i++ { 3499 x = Sinh(2.5) 3500 } 3501 GlobalF = x 3502 } 3503 3504 func BenchmarkSqrtIndirect(b *testing.B) { 3505 x, y := 0.0, 10.0 3506 f := Sqrt 3507 for i := 0; i < b.N; i++ { 3508 x += f(y) 3509 } 3510 GlobalF = x 3511 } 3512 3513 func BenchmarkSqrtLatency(b *testing.B) { 3514 x := 10.0 3515 for i := 0; i < b.N; i++ { 3516 x = Sqrt(x) 3517 } 3518 GlobalF = x 3519 } 3520 3521 func BenchmarkSqrtIndirectLatency(b *testing.B) { 3522 x := 10.0 3523 f := Sqrt 3524 for i := 0; i < b.N; i++ { 3525 x = f(x) 3526 } 3527 GlobalF = x 3528 } 3529 3530 func BenchmarkSqrtGoLatency(b *testing.B) { 3531 x := 10.0 3532 for i := 0; i < b.N; i++ { 3533 x = SqrtGo(x) 3534 } 3535 GlobalF = x 3536 } 3537 3538 func isPrime(i int) bool { 3539 // Yes, this is a dumb way to write this code, 3540 // but calling Sqrt repeatedly in this way demonstrates 3541 // the benefit of using a direct SQRT instruction on systems 3542 // that have one, whereas the obvious loop seems not to 3543 // demonstrate such a benefit. 3544 for j := 2; float64(j) <= Sqrt(float64(i)); j++ { 3545 if i%j == 0 { 3546 return false 3547 } 3548 } 3549 return true 3550 } 3551 3552 func BenchmarkSqrtPrime(b *testing.B) { 3553 x := false 3554 for i := 0; i < b.N; i++ { 3555 x = isPrime(100003) 3556 } 3557 GlobalB = x 3558 } 3559 3560 func BenchmarkTan(b *testing.B) { 3561 x := 0.0 3562 for i := 0; i < b.N; i++ { 3563 x = Tan(.5) 3564 } 3565 GlobalF = x 3566 } 3567 3568 func BenchmarkTanh(b *testing.B) { 3569 x := 0.0 3570 for i := 0; i < b.N; i++ { 3571 x = Tanh(2.5) 3572 } 3573 GlobalF = x 3574 } 3575 func BenchmarkTrunc(b *testing.B) { 3576 x := 0.0 3577 for i := 0; i < b.N; i++ { 3578 x = Trunc(.5) 3579 } 3580 GlobalF = x 3581 } 3582 3583 func BenchmarkY0(b *testing.B) { 3584 x := 0.0 3585 for i := 0; i < b.N; i++ { 3586 x = Y0(2.5) 3587 } 3588 GlobalF = x 3589 } 3590 3591 func BenchmarkY1(b *testing.B) { 3592 x := 0.0 3593 for i := 0; i < b.N; i++ { 3594 x = Y1(2.5) 3595 } 3596 GlobalF = x 3597 } 3598 3599 func BenchmarkYn(b *testing.B) { 3600 x := 0.0 3601 for i := 0; i < b.N; i++ { 3602 x = Yn(2, 2.5) 3603 } 3604 GlobalF = x 3605 } 3606