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