| 1 | module math |
| 2 | |
| 3 | struct Fi { |
| 4 | f f64 |
| 5 | i int |
| 6 | } |
| 7 | |
| 8 | const vf_ = [f64(4.9790119248836735e+00), 7.7388724745781045e+00, -2.7688005719200159e-01, |
| 9 | -5.0106036182710749e+00, 9.6362937071984173e+00, 2.9263772392439646e+00, 5.2290834314593066e+00, |
| 10 | 2.7279399104360102e+00, 1.8253080916808550e+00, -8.6859247685756013e+00] |
| 11 | // The expected results below were computed by the high precision calculators |
| 12 | // at https://keisan.casio.com/. More exact input values (array vf_[], above) |
| 13 | // were obtained by printing them with "%.26f". The answers were calculated |
| 14 | // to 26 digits (by using the "Digit number" drop-down control of each |
| 15 | // calculator). |
| 16 | const acos_ = [f64(1.0496193546107222142571536e+00), 6.8584012813664425171660692e-01, |
| 17 | 1.5984878714577160325521819e+00, 2.0956199361475859327461799e+00, 2.7053008467824138592616927e-01, |
| 18 | 1.2738121680361776018155625e+00, 1.0205369421140629186287407e+00, 1.2945003481781246062157835e+00, |
| 19 | 1.3872364345374451433846657e+00, 2.6231510803970463967294145e+00] |
| 20 | const acosh_ = [f64(2.4743347004159012494457618e+00), 2.8576385344292769649802701e+00, |
| 21 | 7.2796961502981066190593175e-01, 2.4796794418831451156471977e+00, 3.0552020742306061857212962e+00, |
| 22 | 2.044238592688586588942468e+00, 2.5158701513104513595766636e+00, 1.99050839282411638174299e+00, |
| 23 | 1.6988625798424034227205445e+00, 2.9611454842470387925531875e+00] |
| 24 | const asin_ = [f64(5.2117697218417440497416805e-01), 8.8495619865825236751471477e-01, |
| 25 | -2.769154466281941332086016e-02, -5.2482360935268931351485822e-01, |
| 26 | 1.3002662421166552333051524e+00, 2.9698415875871901741575922e-01, 5.5025938468083370060258102e-01, |
| 27 | 2.7629597861677201301553823e-01, 1.83559892257451475846656e-01, -1.0523547536021497774980928e+00] |
| 28 | const asinh_ = [f64(2.3083139124923523427628243e+00), 2.743551594301593620039021e+00, |
| 29 | -2.7345908534880091229413487e-01, -2.3145157644718338650499085e+00, |
| 30 | 2.9613652154015058521951083e+00, 1.7949041616585821933067568e+00, 2.3564032905983506405561554e+00, |
| 31 | 1.7287118790768438878045346e+00, 1.3626658083714826013073193e+00, |
| 32 | -2.8581483626513914445234004e+00] |
| 33 | const atan_ = [f64(1.372590262129621651920085e+00), 1.442290609645298083020664e+00, |
| 34 | -2.7011324359471758245192595e-01, -1.3738077684543379452781531e+00, |
| 35 | 1.4673921193587666049154681e+00, 1.2415173565870168649117764e+00, 1.3818396865615168979966498e+00, |
| 36 | 1.2194305844639670701091426e+00, 1.0696031952318783760193244e+00, |
| 37 | -1.4561721938838084990898679e+00] |
| 38 | const atanh_ = [f64(5.4651163712251938116878204e-01), 1.0299474112843111224914709e+00, |
| 39 | -2.7695084420740135145234906e-02, -5.5072096119207195480202529e-01, |
| 40 | 1.9943940993171843235906642e+00, 3.01448604578089708203017e-01, 5.8033427206942188834370595e-01, |
| 41 | 2.7987997499441511013958297e-01, 1.8459947964298794318714228e-01, |
| 42 | -1.3273186910532645867272502e+00] |
| 43 | const atan2_ = [f64(1.1088291730037004444527075e+00), 9.1218183188715804018797795e-01, |
| 44 | 1.5984772603216203736068915e+00, 2.0352918654092086637227327e+00, 8.0391819139044720267356014e-01, |
| 45 | 1.2861075249894661588866752e+00, 1.0889904479131695712182587e+00, 1.3044821793397925293797357e+00, |
| 46 | 1.3902530903455392306872261e+00, 2.2859857424479142655411058e+00] |
| 47 | const ceil_ = [f64(5.0000000000000000e+00), 8.0000000000000000e+00, copysign(0, -1), |
| 48 | -5.0000000000000000e+00, 1.0000000000000000e+01, 3.0000000000000000e+00, 6.0000000000000000e+00, |
| 49 | 3.0000000000000000e+00, 2.0000000000000000e+00, -8.0000000000000000e+00] |
| 50 | const cos_ = [f64(2.634752140995199110787593e-01), 1.148551260848219865642039e-01, |
| 51 | 9.6191297325640768154550453e-01, 2.938141150061714816890637e-01, -9.777138189897924126294461e-01, |
| 52 | -9.7693041344303219127199518e-01, 4.940088096948647263961162e-01, |
| 53 | -9.1565869021018925545016502e-01, -2.517729313893103197176091e-01, -7.39241351595676573201918e-01] |
| 54 | // Results for 100000 * pi + vf_[i] |
| 55 | const cos_large_ = [f64(2.634752141185559426744e-01), 1.14855126055543100712e-01, |
| 56 | 9.61912973266488928113e-01, 2.9381411499556122552e-01, -9.777138189880161924641e-01, |
| 57 | -9.76930413445147608049e-01, 4.940088097314976789841e-01, -9.15658690217517835002e-01, |
| 58 | -2.51772931436786954751e-01, -7.3924135157173099849e-01] |
| 59 | const cosh_ = [f64(7.2668796942212842775517446e+01), 1.1479413465659254502011135e+03, |
| 60 | 1.0385767908766418550935495e+00, 7.5000957789658051428857788e+01, 7.655246669605357888468613e+03, |
| 61 | 9.3567491758321272072888257e+00, 9.331351599270605471131735e+01, 7.6833430994624643209296404e+00, |
| 62 | 3.1829371625150718153881164e+00, 2.9595059261916188501640911e+03] |
| 63 | const exp_ = [f64(1.4533071302642137507696589e+02), 2.2958822575694449002537581e+03, |
| 64 | 7.5814542574851666582042306e-01, 6.6668778421791005061482264e-03, 1.5310493273896033740861206e+04, |
| 65 | 1.8659907517999328638667732e+01, 1.8662167355098714543942057e+02, 1.5301332413189378961665788e+01, |
| 66 | 6.2047063430646876349125085e+00, 1.6894712385826521111610438e-04] |
| 67 | const expm1_ = [f64(5.105047796122957327384770212e-02), 8.046199708567344080562675439e-02, |
| 68 | -2.764970978891639815187418703e-03, -4.8871434888875355394330300273e-02, |
| 69 | 1.0115864277221467777117227494e-01, 2.969616407795910726014621657e-02, |
| 70 | 5.368214487944892300914037972e-02, 2.765488851131274068067445335e-02, |
| 71 | 1.842068661871398836913874273e-02, -8.3193870863553801814961137573e-02] |
| 72 | const expm1_large_ = [f64(4.2031418113550844e+21), 4.0690789717473863e+33, -0.9372627915981363e+00, |
| 73 | -1.0, 7.077694784145933e+41, 5.117936223839153e+12, 5.124137759001189e+22, 7.03546003972584e+11, |
| 74 | 8.456921800389698e+07, -1.0] |
| 75 | const exp2_ = [f64(3.1537839463286288034313104e+01), 2.1361549283756232296144849e+02, |
| 76 | 8.2537402562185562902577219e-01, 3.1021158628740294833424229e-02, 7.9581744110252191462569661e+02, |
| 77 | 7.6019905892596359262696423e+00, 3.7506882048388096973183084e+01, 6.6250893439173561733216375e+00, |
| 78 | 3.5438267900243941544605339e+00, 2.4281533133513300984289196e-03] |
| 79 | const fabs_ = [f64(4.9790119248836735e+00), 7.7388724745781045e+00, 2.7688005719200159e-01, |
| 80 | 5.0106036182710749e+00, 9.6362937071984173e+00, 2.9263772392439646e+00, 5.2290834314593066e+00, |
| 81 | 2.7279399104360102e+00, 1.8253080916808550e+00, 8.6859247685756013e+00] |
| 82 | const floor_ = [f64(4.0000000000000000e+00), 7.0000000000000000e+00, -1.0000000000000000e+00, |
| 83 | -6.0000000000000000e+00, 9.0000000000000000e+00, 2.0000000000000000e+00, 5.0000000000000000e+00, |
| 84 | 2.0000000000000000e+00, 1.0000000000000000e+00, -9.0000000000000000e+00] |
| 85 | const fmod_ = [f64(4.197615023265299782906368e-02), 2.261127525421895434476482e+00, |
| 86 | 3.231794108794261433104108e-02, 4.989396381728925078391512e+00, 3.637062928015826201999516e-01, |
| 87 | 1.220868282268106064236690e+00, 4.770916568540693347699744e+00, 1.816180268691969246219742e+00, |
| 88 | 8.734595415957246977711748e-01, 1.314075231424398637614104e+00] |
| 89 | const frexp_ = [Fi{6.2237649061045918750e-01, 3}, Fi{9.6735905932226306250e-01, 3}, |
| 90 | Fi{-5.5376011438400318000e-01, -1}, Fi{-6.2632545228388436250e-01, 3}, |
| 91 | Fi{6.02268356699901081250e-01, 4}, Fi{7.3159430981099115000e-01, 2}, |
| 92 | Fi{6.5363542893241332500e-01, 3}, Fi{6.8198497760900255000e-01, 2}, |
| 93 | Fi{9.1265404584042750000e-01, 1}, Fi{-5.4287029803597508250e-01, 4}] |
| 94 | const gamma_ = [f64(2.3254348370739963835386613898e+01), 2.991153837155317076427529816e+03, |
| 95 | -4.561154336726758060575129109e+00, 7.719403468842639065959210984e-01, |
| 96 | 1.6111876618855418534325755566e+05, 1.8706575145216421164173224946e+00, |
| 97 | 3.4082787447257502836734201635e+01, 1.579733951448952054898583387e+00, |
| 98 | 9.3834586598354592860187267089e-01, -2.093995902923148389186189429e-05] |
| 99 | const log_gamma_ = [Fi{3.146492141244545774319734e+00, 1}, Fi{8.003414490659126375852113e+00, 1}, |
| 100 | Fi{1.517575735509779707488106e+00, -1}, Fi{-2.588480028182145853558748e-01, 1}, |
| 101 | Fi{1.1989897050205555002007985e+01, 1}, Fi{6.262899811091257519386906e-01, 1}, |
| 102 | Fi{3.5287924899091566764846037e+00, 1}, Fi{4.5725644770161182299423372e-01, 1}, |
| 103 | Fi{-6.363667087767961257654854e-02, 1}, Fi{-1.077385130910300066425564e+01, -1}] |
| 104 | const log_ = [f64(1.605231462693062999102599e+00), 2.0462560018708770653153909e+00, |
| 105 | -1.2841708730962657801275038e+00, 1.6115563905281545116286206e+00, |
| 106 | 2.2655365644872016636317461e+00, 1.0737652208918379856272735e+00, 1.6542360106073546632707956e+00, |
| 107 | 1.0035467127723465801264487e+00, 6.0174879014578057187016475e-01, 2.161703872847352815363655e+00] |
| 108 | const logb_ = [f64(2.0000000000000000e+00), 2.0000000000000000e+00, -2.0000000000000000e+00, |
| 109 | 2.0000000000000000e+00, 3.0000000000000000e+00, 1.0000000000000000e+00, 2.0000000000000000e+00, |
| 110 | 1.0000000000000000e+00, 0.0000000000000000e+00, 3.0000000000000000e+00] |
| 111 | const log10_ = [f64(6.9714316642508289412205613e-01), 8.8867769017393205555066515e-01, |
| 112 | -5.5770832400658929815908236e-01, 6.998900476822994346229723e-01, 9.8391002850684228242528206e-01, |
| 113 | 4.6633031029295152203317798e-01, 7.1842557117242322739514293e-01, 4.3583479968917770985825655e-01, |
| 114 | 2.6133617905227035649318168e-01, 9.3881606348649405716214241e-01] |
| 115 | const log1p_ = [f64(4.8590257759797794104158205e-02), 7.4540265965225865330849141e-02, |
| 116 | -2.7726407903942672823234024e-03, -5.1404917651627649094953380e-02, |
| 117 | 9.1998280672258624681335010e-02, 2.8843762576593352865894824e-02, 5.0969534581863707268992645e-02, |
| 118 | 2.6913947602193238458458594e-02, 1.8088493239630770262045333e-02, |
| 119 | -9.0865245631588989681559268e-02] |
| 120 | const log2_ = [f64(2.3158594707062190618898251e+00), 2.9521233862883917703341018e+00, |
| 121 | -1.8526669502700329984917062e+00, 2.3249844127278861543568029e+00, 3.268478366538305087466309e+00, |
| 122 | 1.5491157592596970278166492e+00, 2.3865580889631732407886495e+00, 1.447811865817085365540347e+00, |
| 123 | 8.6813999540425116282815557e-01, 3.118679457227342224364709e+00] |
| 124 | const modf_ = [[f64(4.0000000000000000e+00), 9.7901192488367350108546816e-01], |
| 125 | [f64(7.0000000000000000e+00), 7.3887247457810456552351752e-01], |
| 126 | [f64(-0.0), -2.7688005719200159404635997e-01], |
| 127 | [f64(-5.0000000000000000e+00), |
| 128 | -1.060361827107492160848778e-02], |
| 129 | [f64(9.0000000000000000e+00), 6.3629370719841737980004837e-01], |
| 130 | [f64(2.0000000000000000e+00), 9.2637723924396464525443662e-01], |
| 131 | [f64(5.0000000000000000e+00), 2.2908343145930665230025625e-01], |
| 132 | [f64(2.0000000000000000e+00), 7.2793991043601025126008608e-01], |
| 133 | [f64(1.0000000000000000e+00), 8.2530809168085506044576505e-01], |
| 134 | [f64(-8.0000000000000000e+00), -6.8592476857560136238589621e-01]] |
| 135 | const nextafter32_ = [4.979012489318848e+00, 7.738873004913330e+00, -2.768800258636475e-01, |
| 136 | -5.010602951049805e+00, 9.636294364929199e+00, 2.926377534866333e+00, 5.229084014892578e+00, |
| 137 | 2.727940082550049e+00, 1.825308203697205e+00, -8.685923576354980e+00] |
| 138 | const nextafter64_ = [f64(4.97901192488367438926388786e+00), 7.73887247457810545370193722e+00, |
| 139 | -2.7688005719200153853520874e-01, -5.01060361827107403343006808e+00, |
| 140 | 9.63629370719841915615688777e+00, 2.92637723924396508934364647e+00, |
| 141 | 5.22908343145930754047867595e+00, 2.72793991043601069534929593e+00, |
| 142 | 1.82530809168085528249036997e+00, -8.68592476857559958602905681e+00] |
| 143 | const pow_ = [f64(9.5282232631648411840742957e+04), 5.4811599352999901232411871e+07, |
| 144 | 5.2859121715894396531132279e-01, 9.7587991957286474464259698e-06, 4.328064329346044846740467e+09, |
| 145 | 8.4406761805034547437659092e+02, 1.6946633276191194947742146e+05, 5.3449040147551939075312879e+02, |
| 146 | 6.688182138451414936380374e+01, 2.0609869004248742886827439e-09] |
| 147 | const remainder_ = [f64(4.197615023265299782906368e-02), 2.261127525421895434476482e+00, |
| 148 | 3.231794108794261433104108e-02, -2.120723654214984321697556e-02, 3.637062928015826201999516e-01, |
| 149 | 1.220868282268106064236690e+00, -4.581668629186133046005125e-01, -9.117596417440410050403443e-01, |
| 150 | 8.734595415957246977711748e-01, 1.314075231424398637614104e+00] |
| 151 | const round_ = [f64(5), 8, copysign(0, -1), -5, 10, 3, 5, 3, 2, -9] |
| 152 | const signbit_ = [false, false, true, true, false, false, false, false, false, true] |
| 153 | const sin_ = [f64(-9.6466616586009283766724726e-01), 9.9338225271646545763467022e-01, |
| 154 | -2.7335587039794393342449301e-01, 9.5586257685042792878173752e-01, |
| 155 | -2.099421066779969164496634e-01, 2.135578780799860532750616e-01, -8.694568971167362743327708e-01, |
| 156 | 4.019566681155577786649878e-01, 9.6778633541687993721617774e-01, -6.734405869050344734943028e-01] |
| 157 | // Results for 100000 * pi + vf_[i] |
| 158 | const sin_large_ = [f64(-9.646661658548936063912e-01), 9.933822527198506903752e-01, |
| 159 | -2.7335587036246899796e-01, 9.55862576853689321268e-01, -2.099421066862688873691e-01, |
| 160 | 2.13557878070308981163e-01, -8.694568970959221300497e-01, 4.01956668098863248917e-01, |
| 161 | 9.67786335404528727927e-01, -6.7344058693131973066e-01] |
| 162 | const sinh_ = [f64(7.2661916084208532301448439e+01), 1.1479409110035194500526446e+03, |
| 163 | -2.8043136512812518927312641e-01, -7.499429091181587232835164e+01, |
| 164 | 7.6552466042906758523925934e+03, 9.3031583421672014313789064e+00, 9.330815755828109072810322e+01, |
| 165 | 7.6179893137269146407361477e+00, 3.021769180549615819524392e+00, -2.95950575724449499189888e+03] |
| 166 | const sqrt_ = [f64(2.2313699659365484748756904e+00), 2.7818829009464263511285458e+00, |
| 167 | 5.2619393496314796848143251e-01, 2.2384377628763938724244104e+00, 3.1042380236055381099288487e+00, |
| 168 | 1.7106657298385224403917771e+00, 2.286718922705479046148059e+00, 1.6516476350711159636222979e+00, |
| 169 | 1.3510396336454586262419247e+00, 2.9471892997524949215723329e+00] |
| 170 | const tan_ = [f64(-3.661316565040227801781974e+00), 8.64900232648597589369854e+00, |
| 171 | -2.8417941955033612725238097e-01, 3.253290185974728640827156e+00, 2.147275640380293804770778e-01, |
| 172 | -2.18600910711067004921551e-01, -1.760002817872367935518928e+00, -4.389808914752818126249079e-01, |
| 173 | -3.843885560201130679995041e+00, 9.10988793377685105753416e-01] |
| 174 | // Results for 100000 * pi + vf_[i] |
| 175 | const tan_large_ = [f64(-3.66131656475596512705e+00), 8.6490023287202547927e+00, |
| 176 | -2.841794195104782406e-01, 3.2532901861033120983e+00, 2.14727564046880001365e-01, |
| 177 | -2.18600910700688062874e-01, -1.760002817699722747043e+00, -4.38980891453536115952e-01, |
| 178 | -3.84388555942723509071e+00, 9.1098879344275101051e-01] |
| 179 | const tanh_ = [f64(9.9990531206936338549262119e-01), 9.9999962057085294197613294e-01, |
| 180 | -2.7001505097318677233756845e-01, -9.9991110943061718603541401e-01, |
| 181 | 9.9999999146798465745022007e-01, 9.9427249436125236705001048e-01, 9.9994257600983138572705076e-01, |
| 182 | 9.9149409509772875982054701e-01, 9.4936501296239685514466577e-01, |
| 183 | -9.9999994291374030946055701e-01] |
| 184 | const trunc_ = [f64(4.0000000000000000e+00), 7.0000000000000000e+00, copysign(0, -1), |
| 185 | -5.0000000000000000e+00, 9.0000000000000000e+00, 2.0000000000000000e+00, 5.0000000000000000e+00, |
| 186 | 2.0000000000000000e+00, 1.0000000000000000e+00, -8.0000000000000000e+00] |
| 187 | |
| 188 | fn soclose(a f64, b f64, e_ f64) bool { |
| 189 | return tolerance(a, b, e_) |
| 190 | } |
| 191 | |
| 192 | fn test_nan() { |
| 193 | $if fast_math { |
| 194 | println('>> skipping ${@METHOD} with -fast-math') |
| 195 | return |
| 196 | } |
| 197 | // Note: these assertions do fail with `-cc gcc -cflags -ffast-math`: |
| 198 | nan_f64 := nan() |
| 199 | assert nan_f64 != nan_f64 |
| 200 | nan_f32 := f32(nan_f64) |
| 201 | assert nan_f32 != nan_f32 |
| 202 | } |
| 203 | |
| 204 | fn test_angle_diff() { |
| 205 | for pair in [ |
| 206 | [pi, pi_2, -pi_2], |
| 207 | [pi_2 * 3.0, pi_2, -pi], |
| 208 | [pi / 6.0, two_thirds * pi, pi_2], |
| 209 | ] { |
| 210 | assert angle_diff(pair[0], pair[1]) == pair[2] |
| 211 | } |
| 212 | } |
| 213 | |
| 214 | fn test_acos() { |
| 215 | for i := 0; i < vf_.len; i++ { |
| 216 | a := vf_[i] / 10 |
| 217 | f := acos(a) |
| 218 | assert soclose(acos_[i], f, 1e-7) |
| 219 | } |
| 220 | vfacos_sc_ := [-pi, 1, pi, nan()] |
| 221 | acos_sc_ := [nan(), 0, nan(), nan()] |
| 222 | for i := 0; i < vfacos_sc_.len; i++ { |
| 223 | f := acos(vfacos_sc_[i]) |
| 224 | assert alike(acos_sc_[i], f) |
| 225 | } |
| 226 | } |
| 227 | |
| 228 | fn test_acosh() { |
| 229 | for i := 0; i < vf_.len; i++ { |
| 230 | a := 1.0 + abs(vf_[i]) |
| 231 | f := acosh(a) |
| 232 | assert veryclose(acosh_[i], f) |
| 233 | } |
| 234 | vfacosh_sc_ := [inf(-1), 0.5, 0.0, 1, inf(1), nan()] |
| 235 | acosh_sc_ := [nan(), nan(), nan(), 0, inf(1), nan()] |
| 236 | for i := 0; i < vfacosh_sc_.len; i++ { |
| 237 | f := acosh(vfacosh_sc_[i]) |
| 238 | assert alike(acosh_sc_[i], f) |
| 239 | } |
| 240 | } |
| 241 | |
| 242 | fn test_asin() { |
| 243 | for i := 0; i < vf_.len; i++ { |
| 244 | a := vf_[i] / 10 |
| 245 | f := asin(a) |
| 246 | assert veryclose(asin_[i], f) |
| 247 | } |
| 248 | vfasin_sc_ := [-pi, copysign(0, -1), 0, pi, nan()] |
| 249 | asin_sc_ := [nan(), copysign(0, -1), 0, nan(), nan()] |
| 250 | for i := 0; i < vfasin_sc_.len; i++ { |
| 251 | f := asin(vfasin_sc_[i]) |
| 252 | assert alike(asin_sc_[i], f) |
| 253 | } |
| 254 | } |
| 255 | |
| 256 | fn test_asinh() { |
| 257 | for i := 0; i < vf_.len; i++ { |
| 258 | f := asinh(vf_[i]) |
| 259 | assert veryclose(asinh_[i], f) |
| 260 | } |
| 261 | vfasinh_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 262 | asinh_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 263 | for i := 0; i < vfasinh_sc_.len; i++ { |
| 264 | f := asinh(vfasinh_sc_[i]) |
| 265 | assert alike(asinh_sc_[i], f) |
| 266 | } |
| 267 | } |
| 268 | |
| 269 | fn test_atan() { |
| 270 | for i := 0; i < vf_.len; i++ { |
| 271 | f := atan(vf_[i]) |
| 272 | assert veryclose(atan_[i], f) |
| 273 | } |
| 274 | vfatan_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 275 | atan_sc_ := [f64(-pi / 2), copysign(0, -1), 0, pi / 2, nan()] |
| 276 | for i := 0; i < vfatan_sc_.len; i++ { |
| 277 | f := atan(vfatan_sc_[i]) |
| 278 | assert alike(atan_sc_[i], f) |
| 279 | } |
| 280 | } |
| 281 | |
| 282 | fn test_atanh() { |
| 283 | for i := 0; i < vf_.len; i++ { |
| 284 | a := vf_[i] / 10 |
| 285 | f := atanh(a) |
| 286 | assert veryclose(atanh_[i], f) |
| 287 | } |
| 288 | vfatanh_sc_ := [inf(-1), -pi, -1, copysign(0, -1), 0, 1, pi, inf(1), |
| 289 | nan()] |
| 290 | atanh_sc_ := [nan(), nan(), inf(-1), copysign(0, -1), 0, inf(1), |
| 291 | nan(), nan(), nan()] |
| 292 | for i := 0; i < vfatanh_sc_.len; i++ { |
| 293 | f := atanh(vfatanh_sc_[i]) |
| 294 | assert alike(atanh_sc_[i], f) |
| 295 | } |
| 296 | } |
| 297 | |
| 298 | fn test_atan2() { |
| 299 | for i := 0; i < vf_.len; i++ { |
| 300 | f := atan2(10, vf_[i]) |
| 301 | assert veryclose(atan2_[i], f) |
| 302 | } |
| 303 | vfatan2_sc_ := [[inf(-1), inf(-1)], [inf(-1), -pi], [inf(-1), 0], |
| 304 | [inf(-1), pi], [inf(-1), inf(1)], [inf(-1), nan()], [-pi, inf(-1)], |
| 305 | [-pi, 0], [-pi, inf(1)], [-pi, nan()], [f64(-0.0), inf(-1)], |
| 306 | [f64(-0.0), -pi], [f64(-0.0), -0.0], [f64(-0.0), 0], [f64(-0.0), pi], |
| 307 | [f64(-0.0), inf(1)], [f64(-0.0), nan()], [f64(0), inf(-1)], |
| 308 | [f64(0), -pi], [f64(0), -0.0], [f64(0), 0], [f64(0), pi], |
| 309 | [f64(0), inf(1)], [f64(0), nan()], [pi, inf(-1)], [pi, 0], |
| 310 | [pi, inf(1)], [pi, nan()], [inf(1), inf(-1)], [inf(1), -pi], |
| 311 | [inf(1), 0], [inf(1), pi], [inf(1), inf(1)], [inf(1), nan()], |
| 312 | [nan(), nan()]] |
| 313 | atan2_sc_ := [f64(-3.0) * pi / 4.0, // atan2(-inf, -inf) |
| 314 | -pi / 2, // atan2(-inf, -pi) |
| 315 | -pi / 2, // atan2(-inf, +0) |
| 316 | -pi / 2, // atan2(-inf, pi) |
| 317 | -pi / 4, // atan2(-inf, +inf) |
| 318 | nan(), // atan2(-inf, nan) |
| 319 | -pi, // atan2(-pi, -inf) |
| 320 | -pi / 2, // atan2(-pi, +0) |
| 321 | -0.0, // atan2(-pi, inf) |
| 322 | nan(), // atan2(-pi, nan) |
| 323 | -pi, // atan2(-0, -inf) |
| 324 | -pi, // atan2(-0, -pi) |
| 325 | -pi, // atan2(-0, -0) |
| 326 | -0.0, // atan2(-0, +0) |
| 327 | -0.0, // atan2(-0, pi) |
| 328 | -0.0, // atan2(-0, +inf) |
| 329 | nan(), // atan2(-0, nan) |
| 330 | pi, // atan2(+0, -inf) |
| 331 | pi, // atan2(+0, -pi) |
| 332 | pi, // atan2(+0, -0) |
| 333 | 0, // atan2(+0, +0) |
| 334 | 0, // atan2(+0, pi) |
| 335 | 0, // atan2(+0, +inf) |
| 336 | nan(), // atan2(+0, nan) |
| 337 | pi, // atan2(pi, -inf) |
| 338 | pi / 2, // atan2(pi, +0) |
| 339 | 0, // atan2(pi, +inf) |
| 340 | nan(), // atan2(pi, nan) |
| 341 | 3.0 * pi / 4, // atan2(+inf, -inf) |
| 342 | pi / 2, // atan2(+inf, -pi) |
| 343 | pi / 2, // atan2(+inf, +0) |
| 344 | pi / 2, // atan2(+inf, pi) |
| 345 | pi / 4, // atan2(+inf, +inf) |
| 346 | nan(), // atan2(+inf, nan) |
| 347 | nan(), // atan2(nan, nan) |
| 348 | ] |
| 349 | for i := 0; i < vfatan2_sc_.len; i++ { |
| 350 | f := atan2(vfatan2_sc_[i][0], vfatan2_sc_[i][1]) |
| 351 | // Note: fails with `-cc gcc -cflags -ffast-math` |
| 352 | $if !fast_math { |
| 353 | assert alike(atan2_sc_[i], f), 'atan2_sc_[i]: ${atan2_sc_[i]:10}, f: ${f:10}' |
| 354 | } |
| 355 | } |
| 356 | } |
| 357 | |
| 358 | fn test_ceil() { |
| 359 | // for i := 0; i < vf_.len; i++ { |
| 360 | // f := ceil(vf_[i]) |
| 361 | // assert alike(ceil_[i], f) |
| 362 | // } |
| 363 | vfceil_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 364 | ceil_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 365 | for i := 0; i < vfceil_sc_.len; i++ { |
| 366 | f := ceil(vfceil_sc_[i]) |
| 367 | assert alike(ceil_sc_[i], f) |
| 368 | } |
| 369 | } |
| 370 | |
| 371 | fn test_cos() { |
| 372 | for i := 0; i < vf_.len; i++ { |
| 373 | f := cos(vf_[i]) |
| 374 | assert veryclose(cos_[i], f) |
| 375 | } |
| 376 | vfcos_sc_ := [inf(-1), inf(1), nan()] |
| 377 | cos_sc_ := [nan(), nan(), nan()] |
| 378 | for i := 0; i < vfcos_sc_.len; i++ { |
| 379 | f := cos(vfcos_sc_[i]) |
| 380 | assert alike(cos_sc_[i], f) |
| 381 | } |
| 382 | } |
| 383 | |
| 384 | fn test_cosh() { |
| 385 | for i := 0; i < vf_.len; i++ { |
| 386 | f := cosh(vf_[i]) |
| 387 | assert close(cosh_[i], f) |
| 388 | } |
| 389 | vfcosh_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 390 | cosh_sc_ := [inf(1), 1, 1, inf(1), nan()] |
| 391 | for i := 0; i < vfcosh_sc_.len; i++ { |
| 392 | f := cosh(vfcosh_sc_[i]) |
| 393 | assert alike(cosh_sc_[i], f) |
| 394 | } |
| 395 | } |
| 396 | |
| 397 | fn test_expm1() { |
| 398 | for i := 0; i < vf_.len; i++ { |
| 399 | a := vf_[i] / 100 |
| 400 | f := expm1(a) |
| 401 | assert veryclose(expm1_[i], f) |
| 402 | } |
| 403 | for i := 0; i < vf_.len; i++ { |
| 404 | a := vf_[i] * 10 |
| 405 | f := expm1(a) |
| 406 | assert close(expm1_large_[i], f) |
| 407 | } |
| 408 | // vfexpm1_sc_ := [f64(-710), copysign(0, -1), 0, 710, inf(1), nan()] |
| 409 | // expm1_sc_ := [f64(-1), copysign(0, -1), 0, inf(1), inf(1), nan()] |
| 410 | // for i := 0; i < vfexpm1_sc_.len; i++ { |
| 411 | // f := expm1(vfexpm1_sc_[i]) |
| 412 | // assert alike(expm1_sc_[i], f) |
| 413 | // } |
| 414 | } |
| 415 | |
| 416 | fn test_abs() { |
| 417 | for i := 0; i < vf_.len; i++ { |
| 418 | f := abs(vf_[i]) |
| 419 | assert fabs_[i] == f |
| 420 | } |
| 421 | } |
| 422 | |
| 423 | fn test_abs_zero() { |
| 424 | ret1 := abs(0) |
| 425 | println(ret1) |
| 426 | assert '${ret1}' == '0' |
| 427 | |
| 428 | ret2 := abs(0.0) |
| 429 | println(ret2) |
| 430 | assert '${ret2}' == '0.0' |
| 431 | } |
| 432 | |
| 433 | fn test_floor() { |
| 434 | for i := 0; i < vf_.len; i++ { |
| 435 | f := floor(vf_[i]) |
| 436 | assert alike(floor_[i], f) |
| 437 | } |
| 438 | vfceil_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 439 | ceil_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 440 | for i := 0; i < vfceil_sc_.len; i++ { |
| 441 | f := floor(vfceil_sc_[i]) |
| 442 | assert alike(ceil_sc_[i], f) |
| 443 | } |
| 444 | } |
| 445 | |
| 446 | fn test_max() { |
| 447 | for i := 0; i < vf_.len; i++ { |
| 448 | f := max(vf_[i], ceil_[i]) |
| 449 | assert ceil_[i] == f |
| 450 | } |
| 451 | } |
| 452 | |
| 453 | fn test_min() { |
| 454 | for i := 0; i < vf_.len; i++ { |
| 455 | f := min(vf_[i], floor_[i]) |
| 456 | assert floor_[i] == f |
| 457 | } |
| 458 | } |
| 459 | |
| 460 | fn test_clamp() { |
| 461 | assert clamp(2, 5, 10) == 5 |
| 462 | assert clamp(7, 5, 10) == 7 |
| 463 | assert clamp(15, 5, 10) == 10 |
| 464 | assert clamp(5, 5, 10) == 5 |
| 465 | assert clamp(10, 5, 10) == 10 |
| 466 | } |
| 467 | |
| 468 | fn test_signi() { |
| 469 | assert signi(inf(-1)) == -1 |
| 470 | assert signi(-72234878292.4586129) == -1 |
| 471 | assert signi(-10) == -1 |
| 472 | assert signi(-pi) == -1 |
| 473 | assert signi(-1) == -1 |
| 474 | assert signi(-0.000000000001) == -1 |
| 475 | assert signi(-0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001) == -1 |
| 476 | assert signi(-0.0) == -1 |
| 477 | |
| 478 | assert signi(inf(1)) == 1 |
| 479 | assert signi(72234878292.4586129) == 1 |
| 480 | assert signi(10) == 1 |
| 481 | assert signi(pi) == 1 |
| 482 | assert signi(1) == 1 |
| 483 | assert signi(0.000000000001) == 1 |
| 484 | assert signi(0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001) == 1 |
| 485 | assert signi(0.0) == 1 |
| 486 | assert signi(nan()) == 1 |
| 487 | } |
| 488 | |
| 489 | fn test_sign() { |
| 490 | assert sign(inf(-1)) == -1.0 |
| 491 | assert sign(-72234878292.4586129) == -1.0 |
| 492 | assert sign(-10) == -1.0 |
| 493 | assert sign(-pi) == -1.0 |
| 494 | assert sign(-1) == -1.0 |
| 495 | assert sign(-0.000000000001) == -1.0 |
| 496 | assert sign(-0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001) == -1.0 |
| 497 | assert sign(-0.0) == -1.0 |
| 498 | |
| 499 | assert sign(inf(1)) == 1.0 |
| 500 | assert sign(72234878292.4586129) == 1 |
| 501 | assert sign(10) == 1.0 |
| 502 | assert sign(pi) == 1.0 |
| 503 | assert sign(1) == 1.0 |
| 504 | assert sign(0.000000000001) == 1.0 |
| 505 | assert sign(0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001) == 1.0 |
| 506 | assert sign(0.0) == 1.0 |
| 507 | $if !fast_math { |
| 508 | // Note: these assertions fail with `-cc gcc -cflags -ffast-math`: |
| 509 | assert is_nan(sign(nan())), '${sign(nan()):20}, ${nan():20}' |
| 510 | assert is_nan(sign(-nan())), '${sign(-nan()):20}, ${-nan():20}' |
| 511 | } |
| 512 | } |
| 513 | |
| 514 | fn test_mod() { |
| 515 | for i := 0; i < vf_.len; i++ { |
| 516 | f := mod(10, vf_[i]) |
| 517 | assert fmod_[i] == f |
| 518 | } |
| 519 | // verify precision of result for extreme inputs |
| 520 | f := mod(5.9790119248836734e+200, 1.1258465975523544) |
| 521 | assert (0.6447968302508578) == f |
| 522 | } |
| 523 | |
| 524 | fn test_cbrt() { |
| 525 | cbrts := [2.0, 10, 56] |
| 526 | for idx, i in [8.0, 1000, 175_616] { |
| 527 | assert cbrt(i) == cbrts[idx] |
| 528 | } |
| 529 | } |
| 530 | |
| 531 | fn test_exp() { |
| 532 | for i := 0; i < vf_.len; i++ { |
| 533 | f := exp(vf_[i]) |
| 534 | assert close(exp_[i], f), 'math.exp_[i]: ${exp_[i]:10}, ${f64_bits(exp_[i]):12} | f: ${f}, ${f64_bits(f):12}' |
| 535 | } |
| 536 | vfexp_sc_ := [inf(-1), -2000, 2000, inf(1), nan(), // smallest f64 that overflows Exp(x) |
| 537 | 7.097827128933841e+02, 1.48852223e+09, 1.4885222e+09, 1, // near zero |
| 538 | 3.725290298461915e-09, -740, // denormal |
| 539 | ] |
| 540 | exp_sc_ := [f64(0), 0, inf(1), inf(1), nan(), inf(1), inf(1), |
| 541 | inf(1), 2.718281828459045, 1.0000000037252903, 4.2e-322] |
| 542 | for i := 0; i < vfexp_sc_.len; i++ { |
| 543 | f := exp(vfexp_sc_[i]) |
| 544 | assert close(exp_sc_[i], f) || alike(exp_sc_[i], f), 'exp_sc_[i]: ${exp_sc_[i]:10}, ${f64_bits(exp_sc_[i]):12}, f: ${f:10}, ${f64_bits(f):12}' |
| 545 | } |
| 546 | } |
| 547 | |
| 548 | fn test_exp2() { |
| 549 | for i := 0; i < vf_.len; i++ { |
| 550 | f := exp2(vf_[i]) |
| 551 | assert soclose(exp2_[i], f, 1e-9) |
| 552 | } |
| 553 | vfexp2_sc_ := [f64(-2000), 2000, inf(1), nan(), // smallest f64 that overflows Exp2(x) |
| 554 | 1024, -1.07399999999999e+03, // near underflow |
| 555 | 3.725290298461915e-09, // near zero |
| 556 | ] |
| 557 | exp2_sc_ := [f64(0), inf(1), inf(1), nan(), inf(1), 5e-324, 1.0000000025821745] |
| 558 | for i := 0; i < vfexp2_sc_.len; i++ { |
| 559 | f := exp2(vfexp2_sc_[i]) |
| 560 | assert alike(exp2_sc_[i], f) |
| 561 | } |
| 562 | for n := -1074; n < 1024; n++ { |
| 563 | f := exp2(f64(n)) |
| 564 | vf := ldexp(1, n) |
| 565 | assert veryclose(f, vf) |
| 566 | } |
| 567 | } |
| 568 | |
| 569 | fn test_frexp() { |
| 570 | for i := 0; i < vf_.len; i++ { |
| 571 | f, j := frexp(vf_[i]) |
| 572 | assert veryclose(frexp_[i].f, f) || frexp_[i].i != j |
| 573 | } |
| 574 | // vffrexp_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 575 | // frexp_sc_ := [Fi{inf(-1), 0}, Fi{copysign(0, -1), 0}, Fi{0, 0}, |
| 576 | // Fi{inf(1), 0}, Fi{nan(), 0}] |
| 577 | // for i := 0; i < vffrexp_sc_.len; i++ { |
| 578 | // f, j := frexp(vffrexp_sc_[i]) |
| 579 | // assert alike(frexp_sc_[i].f, f) || frexp_sc_[i].i != j |
| 580 | // } |
| 581 | } |
| 582 | |
| 583 | fn test_gamma() { |
| 584 | vfgamma_ := [[inf(1), inf(1)], [inf(-1), nan()], [f64(0), inf(1)], |
| 585 | [f64(-0.0), inf(-1)], [nan(), nan()], [f64(-1), nan()], |
| 586 | [f64(-2), nan()], [f64(-3), nan()], [f64(-1e+16), nan()], |
| 587 | [f64(-1e+300), nan()], [f64(1.7e+308), inf(1)], // Test inputs inspi_red by Python test suite |
| 588 | |
| 589 | // Outputs computed at high precision by PARI/GP. |
| 590 | // If recomputing table entries), be careful to use |
| 591 | // high-precision (%.1000g) formatting of the f64 inputs. |
| 592 | // For example), -2.0000000000000004 is the f64 with exact value |
| 593 | //-2.00000000000000044408920985626161695), and |
| 594 | // gamma(-2.0000000000000004) = -1249999999999999.5386078562728167651513), while |
| 595 | // gamma(-2.00000000000000044408920985626161695) = -1125899906826907.2044875028130093136826. |
| 596 | // Thus the table lists -1.1258999068426235e+15 as the answer. |
| 597 | [f64(0.5), 1.772453850905516], [f64(1.5), 0.886226925452758], |
| 598 | [f64(2.5), 1.329340388179137], [f64(3.5), 3.3233509704478426], |
| 599 | [f64(-0.5), -3.544907701811032], [f64(-1.5), 2.363271801207355], |
| 600 | [f64(-2.5), -0.9453087204829419], [f64(-3.5), 0.2700882058522691], |
| 601 | [f64(0.1), 9.51350769866873], [f64(0.01), 99.4325851191506], |
| 602 | [f64(1e-08), 9.999999942278434e+07], [f64(1e-16), 1e+16], |
| 603 | [f64(0.001), 999.4237724845955], [f64(1e-16), 1e+16], |
| 604 | [f64(1e-308), 1e+308], [f64(5.6e-309), 1.7857142857142864e+308], |
| 605 | [f64(5.5e-309), inf(1)], [f64(1e-309), inf(1)], [f64(1e-323), inf(1)], |
| 606 | [f64(5e-324), inf(1)], [f64(-0.1), -10.686287021193193], |
| 607 | [f64(-0.01), -100.58719796441078], [f64(-1e-08), -1.0000000057721567e+08], |
| 608 | [f64(-1e-16), -1e+16], [f64(-0.001), -1000.5782056293586], |
| 609 | [f64(-1e-16), -1e+16], [f64(-1e-308), -1e+308], [f64(-5.6e-309), -1.7857142857142864e+308], |
| 610 | [f64(-5.5e-309), inf(-1)], [f64(-1e-309), inf(-1)], [f64(-1e-323), inf(-1)], |
| 611 | [f64(-5e-324), inf(-1)], [f64(-0.9999999999999999), -9.007199254740992e+15], |
| 612 | [f64(-1.0000000000000002), 4.5035996273704955e+15], |
| 613 | [f64(-1.9999999999999998), |
| 614 | 2.2517998136852485e+15], |
| 615 | [f64(-2.0000000000000004), -1.1258999068426235e+15], |
| 616 | [f64(-100.00000000000001), |
| 617 | -7.540083334883109e-145], |
| 618 | [f64(-99.99999999999999), 7.540083334884096e-145], [f64(17), 2.0922789888e+13], |
| 619 | [f64(171), 7.257415615307999e+306], [f64(171.6), 1.5858969096672565e+308], |
| 620 | [f64(171.624), 1.7942117599248104e+308], [f64(171.625), inf(1)], |
| 621 | [f64(172), inf(1)], [f64(2000), inf(1)], [f64(-100.5), -3.3536908198076787e-159], |
| 622 | [f64(-160.5), -5.255546447007829e-286], [f64(-170.5), -3.3127395215386074e-308], |
| 623 | [f64(-171.5), 1.9316265431712e-310], [f64(-176.5), -1.196e-321], |
| 624 | [f64(-177.5), 5e-324], [f64(-178.5), -0.0], [f64(-179.5), 0], |
| 625 | [f64(-201.0001), 0], [f64(-202.9999), -0.0], [f64(-1000.5), -0.0], |
| 626 | [f64(-1.0000000003e+09), -0.0], [f64(-4.5035996273704955e+15), 0], |
| 627 | [f64(-63.349078729022985), 4.177797167776188e-88], |
| 628 | [f64(-127.45117632943295), |
| 629 | 1.183111089623681e-214]] |
| 630 | _ := vfgamma_[0][0] |
| 631 | // @todo: Figure out solution for C backend |
| 632 | // for i := 0; i < math.vf_.len; i++ { |
| 633 | // f := gamma(math.vf_[i]) |
| 634 | // assert veryclose(math.gamma_[i], f) |
| 635 | // } |
| 636 | // for _, g in vfgamma_ { |
| 637 | // f := gamma(g[0]) |
| 638 | // if is_nan(g[1]) || is_inf(g[1], 0) || g[1] == 0 || f == 0 { |
| 639 | // assert alike(g[1], f) |
| 640 | // } else if g[0] > -50 && g[0] <= 171 { |
| 641 | // assert veryclose(g[1], f) |
| 642 | // } else { |
| 643 | // assert soclose(g[1], f, 1e-9) |
| 644 | // } |
| 645 | // } |
| 646 | } |
| 647 | |
| 648 | fn test_hypot() { |
| 649 | for i := 0; i < vf_.len; i++ { |
| 650 | a := abs(1e+200 * tanh_[i] * sqrt(2.0)) |
| 651 | f := hypot(1e+200 * tanh_[i], 1e+200 * tanh_[i]) |
| 652 | assert veryclose(a, f) |
| 653 | } |
| 654 | vfhypot_sc_ := [[inf(-1), inf(-1)], [inf(-1), 0], [inf(-1), |
| 655 | inf(1)], |
| 656 | [inf(-1), nan()], [f64(-0.0), -0.0], [f64(-0.0), 0], [f64(0), -0.0], |
| 657 | [f64(0), 0], [f64(0), inf(-1)], [f64(0), inf(1)], [f64(0), nan()], |
| 658 | [inf(1), inf(-1)], [inf(1), 0], [inf(1), inf(1)], [inf(1), |
| 659 | nan()], |
| 660 | [nan(), inf(-1)], [nan(), 0], [nan(), inf(1)], [nan(), |
| 661 | nan()], |
| 662 | [-0.0, max_f64]] |
| 663 | hypot_sc_ := [inf(1), inf(1), inf(1), inf(1), 0, 0, 0, 0, inf(1), |
| 664 | inf(1), nan(), inf(1), inf(1), inf(1), inf(1), inf(1), |
| 665 | nan(), inf(1), nan(), max_f64] |
| 666 | for i := 0; i < vfhypot_sc_.len; i++ { |
| 667 | f := hypot(vfhypot_sc_[i][0], vfhypot_sc_[i][1]) |
| 668 | assert alike(hypot_sc_[i], f) |
| 669 | } |
| 670 | } |
| 671 | |
| 672 | fn test_ldexp() { |
| 673 | for i := 0; i < vf_.len; i++ { |
| 674 | f := ldexp(frexp_[i].f, frexp_[i].i) |
| 675 | assert veryclose(vf_[i], f) |
| 676 | } |
| 677 | vffrexp_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 678 | frexp_sc_ := [Fi{inf(-1), 0}, Fi{copysign(0, -1), 0}, Fi{0, 0}, |
| 679 | Fi{inf(1), 0}, Fi{nan(), 0}] |
| 680 | for i := 0; i < vffrexp_sc_.len; i++ { |
| 681 | f := ldexp(frexp_sc_[i].f, frexp_sc_[i].i) |
| 682 | assert alike(vffrexp_sc_[i], f) |
| 683 | } |
| 684 | vfldexp_sc_ := [Fi{0, 0}, Fi{0, -1075}, Fi{0, 1024}, Fi{copysign(0, -1), 0}, |
| 685 | Fi{copysign(0, -1), -1075}, Fi{copysign(0, -1), 1024}, |
| 686 | Fi{inf(1), 0}, Fi{inf(1), -1024}, Fi{inf(-1), 0}, Fi{inf(-1), -1024}, |
| 687 | Fi{nan(), -1024}, Fi{10, 1 << (u64(sizeof(int) - 1) * 8)}, |
| 688 | Fi{10, -(1 << (u64(sizeof(int) - 1) * 8))}] |
| 689 | ldexp_sc_ := [f64(0), 0, 0, copysign(0, -1), copysign(0, -1), |
| 690 | copysign(0, -1), inf(1), inf(1), inf(-1), inf(-1), nan(), |
| 691 | inf(1), 0] |
| 692 | for i := 0; i < vfldexp_sc_.len; i++ { |
| 693 | f := ldexp(vfldexp_sc_[i].f, vfldexp_sc_[i].i) |
| 694 | assert alike(ldexp_sc_[i], f) |
| 695 | } |
| 696 | } |
| 697 | |
| 698 | fn test_log_gamma() { |
| 699 | for i := 0; i < vf_.len; i++ { |
| 700 | f, s := log_gamma_sign(vf_[i]) |
| 701 | assert soclose(log_gamma_[i].f, f, 1e-6) && log_gamma_[i].i == s |
| 702 | } |
| 703 | // vflog_gamma_sc_ := [inf(-1), -3, 0, 1, 2, inf(1), nan()] |
| 704 | // log_gamma_sc_ := [Fi{inf(-1), 1}, Fi{inf(1), 1}, Fi{inf(1), 1}, |
| 705 | // Fi{0, 1}, Fi{0, 1}, Fi{inf(1), 1}, Fi{nan(), 1}] |
| 706 | // for i := 0; i < vflog_gamma_sc_.len; i++ { |
| 707 | // f, s := log_gamma_sign(vflog_gamma_sc_[i]) |
| 708 | // assert alike(log_gamma_sc_[i].f, f) && log_gamma_sc_[i].i == s |
| 709 | // } |
| 710 | } |
| 711 | |
| 712 | fn test_log() { |
| 713 | for i := 0; i < vf_.len; i++ { |
| 714 | a := abs(vf_[i]) |
| 715 | f := log(a) |
| 716 | assert log_[i] == f |
| 717 | } |
| 718 | vflog_sc_ := [inf(-1), -pi, copysign(0, -1), 0, 1, inf(1), |
| 719 | nan()] |
| 720 | log_sc_ := [nan(), nan(), inf(-1), inf(-1), 0, inf(1), nan()] |
| 721 | f := log(10) |
| 722 | assert f == ln10 |
| 723 | for i := 0; i < vflog_sc_.len; i++ { |
| 724 | g := log(vflog_sc_[i]) |
| 725 | assert alike(log_sc_[i], g) |
| 726 | } |
| 727 | } |
| 728 | |
| 729 | fn test_log10() { |
| 730 | for i := 0; i < vf_.len; i++ { |
| 731 | a := abs(vf_[i]) |
| 732 | f := log10(a) |
| 733 | assert veryclose(log10_[i], f) |
| 734 | } |
| 735 | vflog_sc_ := [inf(-1), -pi, copysign(0, -1), 0, 1, inf(1), |
| 736 | nan()] |
| 737 | log_sc_ := [nan(), nan(), inf(-1), inf(-1), 0, inf(1), nan()] |
| 738 | for i := 0; i < vflog_sc_.len; i++ { |
| 739 | f := log10(vflog_sc_[i]) |
| 740 | assert alike(log_sc_[i], f) |
| 741 | } |
| 742 | } |
| 743 | |
| 744 | fn test_pow() { |
| 745 | for i := 0; i < vf_.len; i++ { |
| 746 | f := pow(10, vf_[i]) |
| 747 | assert close(pow_[i], f) |
| 748 | } |
| 749 | vfpow_sc_ := [[inf(-1), -pi], [inf(-1), -3], [inf(-1), -0.0], |
| 750 | [inf(-1), 0], [inf(-1), 1], [inf(-1), 3], [inf(-1), pi], |
| 751 | [inf(-1), 0.5], [inf(-1), nan()], [-pi, inf(-1)], [-pi, -pi], |
| 752 | [-pi, -0.0], [-pi, 0], [-pi, 1], [-pi, pi], [-pi, inf(1)], |
| 753 | [-pi, nan()], [f64(-1), inf(-1)], [f64(-1), inf(1)], [f64(-1), nan()], |
| 754 | [f64(-1 / 2), inf(-1)], [f64(-1 / 2), inf(1)], [f64(-0.0), inf(-1)], |
| 755 | [f64(-0.0), -pi], [f64(-0.0), -0.5], [f64(-0.0), -3], |
| 756 | [f64(-0.0), 3], [f64(-0.0), pi], [f64(-0.0), 0.5], [f64(-0.0), inf(1)], |
| 757 | [f64(0), inf(-1)], [f64(0), -pi], [f64(0), -3], [f64(0), -0.0], |
| 758 | [f64(0), 0], [f64(0), 3], [f64(0), pi], [f64(0), inf(1)], |
| 759 | [f64(0), nan()], [f64(1 / 2), inf(-1)], [f64(1 / 2), inf(1)], |
| 760 | [f64(1), inf(-1)], [f64(1), inf(1)], [f64(1), nan()], |
| 761 | [pi, inf(-1)], [pi, -0.0], [pi, 0], [pi, 1], [pi, inf(1)], |
| 762 | [pi, nan()], [inf(1), -pi], [inf(1), -0.0], [inf(1), 0], |
| 763 | [inf(1), 1], [inf(1), pi], [inf(1), nan()], [nan(), -pi], |
| 764 | [nan(), -0.0], [nan(), 0], [nan(), 1], [nan(), pi], [nan(), |
| 765 | nan()], |
| 766 | [5.0, 2.0], [5.0, 3.0], [5.0, 10.0], [5.0, -2.0], [-5.0, -1.0], |
| 767 | [-5.0, -2.0], [-5.0, -3.0]] |
| 768 | pow_sc_ := [f64(0), // pow(-inf, -pi) |
| 769 | -0.0, // pow(-inf, -3) |
| 770 | 1, // pow(-inf, -0) |
| 771 | 1, // pow(-inf, +0) |
| 772 | inf(-1), // pow(-inf, 1) |
| 773 | inf(-1), // pow(-inf, 3) |
| 774 | inf(1), // pow(-inf, pi) |
| 775 | inf(1), // pow(-inf, 0.5) |
| 776 | nan(), // pow(-inf, nan) |
| 777 | 0, // pow(-pi, -inf) |
| 778 | nan(), // pow(-pi, -pi) |
| 779 | 1, // pow(-pi, -0) |
| 780 | 1, // pow(-pi, +0) |
| 781 | -pi, // pow(-pi, 1) |
| 782 | nan(), // pow(-pi, pi) |
| 783 | inf(1), // pow(-pi, +inf) |
| 784 | nan(), // pow(-pi, nan) |
| 785 | 1, // pow(-1, -inf) IEEE 754-2008 |
| 786 | 1, // pow(-1, +inf) IEEE 754-2008 |
| 787 | nan(), // pow(-1, nan) |
| 788 | inf(1), // pow(-1/2, -inf) |
| 789 | 0, // pow(-1/2, +inf) |
| 790 | inf(1), // pow(-0, -inf) |
| 791 | inf(1), // pow(-0, -pi) |
| 792 | inf(1), // pow(-0, -0.5) |
| 793 | inf(-1), // pow(-0, -3) IEEE 754-2008 |
| 794 | -0.0, // pow(-0, 3) IEEE 754-2008 |
| 795 | 0, // pow(-0, pi) |
| 796 | 0, // pow(-0, 0.5) |
| 797 | 0, // pow(-0, +inf) |
| 798 | inf(1), // pow(+0, -inf) |
| 799 | inf(1), // pow(+0, -pi) |
| 800 | inf(1), // pow(+0, -3) |
| 801 | 1, // pow(+0, -0) |
| 802 | 1, // pow(+0, +0) |
| 803 | 0, // pow(+0, 3) |
| 804 | 0, // pow(+0, pi) |
| 805 | 0, // pow(+0, +inf) |
| 806 | nan(), // pow(+0, nan) |
| 807 | inf(1), // pow(1/2, -inf) |
| 808 | 0, // pow(1/2, +inf) |
| 809 | 1, // pow(1, -inf) IEEE 754-2008 |
| 810 | 1, // pow(1, +inf) IEEE 754-2008 |
| 811 | 1, // pow(1, nan) IEEE 754-2008 |
| 812 | 0, // pow(pi, -inf) |
| 813 | 1, // pow(pi, -0) |
| 814 | 1, // pow(pi, +0) |
| 815 | pi, // pow(pi, 1) |
| 816 | inf(1), // pow(pi, +inf) |
| 817 | nan(), // pow(pi, nan) |
| 818 | 0, // pow(+inf, -pi) |
| 819 | 1, // pow(+inf, -0) |
| 820 | 1, // pow(+inf, +0) |
| 821 | inf(1), // pow(+inf, 1) |
| 822 | inf(1), // pow(+inf, pi) |
| 823 | nan(), // pow(+inf, nan) |
| 824 | nan(), // pow(nan, -pi) |
| 825 | 1, // pow(nan, -0) |
| 826 | 1, // pow(nan, +0) |
| 827 | nan(), // pow(nan, 1) |
| 828 | nan(), // pow(nan, pi) |
| 829 | nan(), // pow(nan, nan) |
| 830 | 25, // pow(5, 2) => 5 * 5 |
| 831 | 125, // pow(5, 3) => 5 * 5 * 5 |
| 832 | 9765625, // pow(5, 10) |
| 833 | 0.04, // pow(5, -2) |
| 834 | -0.2, // pow(-5, -1) |
| 835 | 0.04, // pow(-5, -2) |
| 836 | -0.008, // pow(-5, -3) |
| 837 | ] |
| 838 | for i := 0; i < vfpow_sc_.len; i++ { |
| 839 | f := pow(vfpow_sc_[i][0], vfpow_sc_[i][1]) |
| 840 | // close() below is needed, otherwise gcc on windows fails with: |
| 841 | // i: 65 | vfpow_sc_[i][0]: 5, vfpow_sc_[i][1]: -2 | pow_sc_[65] = 0.04, f = 0.04000000000000001 |
| 842 | assert close(pow_sc_[i], f) || alike(pow_sc_[i], f), 'i: ${i:3} | vfpow_sc_[i][0]: ${vfpow_sc_[i][0]:10}, vfpow_sc_[i][1]: ${vfpow_sc_[i][1]:10} | pow_sc_[${i}] = ${pow_sc_[i]}, f = ${f}' |
| 843 | } |
| 844 | } |
| 845 | |
| 846 | fn test_round() { |
| 847 | for i := 0; i < vf_.len; i++ { |
| 848 | f := round(vf_[i]) |
| 849 | assert alike(round_[i], f) |
| 850 | } |
| 851 | vfround_sc_ := [[f64(0), 0], [-0.5, -1.0], [nan(), nan()], |
| 852 | [inf(1), inf(1)]] |
| 853 | // vfround_even_sc_ := [[f64(0), 0], [f64(1.390671161567e-309), 0], // denormal |
| 854 | // [f64(0.49999999999999994), 0], // 0.5-epsilon [f64(0.5), 0], |
| 855 | // [f64(0.5000000000000001), 1], // 0.5+epsilon [f64(-1.5), -2], |
| 856 | // [f64(-2.5), -2], [nan(), nan()], [inf(1), inf(1)], |
| 857 | // [f64(2251799813685249.5), 2251799813685250], |
| 858 | // // 1 bit fractian [f64(2251799813685250.5), 2251799813685250], |
| 859 | // [f64(4503599627370495.5), 4503599627370496], // 1 bit fraction, rounding to 0 bit fractian |
| 860 | // [f64(4503599627370497), 4503599627370497], // large integer |
| 861 | // ] |
| 862 | for i := 0; i < vfround_sc_.len; i++ { |
| 863 | f := round(vfround_sc_[i][0]) |
| 864 | assert alike(vfround_sc_[i][1], f) |
| 865 | } |
| 866 | } |
| 867 | |
| 868 | fn fn_test_round_sig() { |
| 869 | assert round_sig(4.3239437319748394, -1) == 4.3239437319748394 |
| 870 | assert round_sig(4.3239437319748394, 0) == 4.0000000000000000 |
| 871 | assert round_sig(4.3239437319748394, 1) == 4.3000000000000000 |
| 872 | assert round_sig(4.3239437319748394, 2) == 4.3200000000000000 |
| 873 | assert round_sig(4.3239437319748394, 3) == 4.3240000000000000 |
| 874 | assert round_sig(4.3239437319748394, 6) == 4.3239440000000000 |
| 875 | assert round_sig(4.3239437319748394, 12) == 4.323943731975 |
| 876 | assert round_sig(4.3239437319748394, 17) == 4.3239437319748394 |
| 877 | } |
| 878 | |
| 879 | fn test_sin() { |
| 880 | for i := 0; i < vf_.len; i++ { |
| 881 | f := sin(vf_[i]) |
| 882 | assert veryclose(sin_[i], f) |
| 883 | } |
| 884 | vfsin_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 885 | sin_sc_ := [nan(), copysign(0, -1), 0, nan(), nan()] |
| 886 | for i := 0; i < vfsin_sc_.len; i++ { |
| 887 | f := sin(vfsin_sc_[i]) |
| 888 | assert alike(sin_sc_[i], f) |
| 889 | } |
| 890 | } |
| 891 | |
| 892 | fn test_sincos() { |
| 893 | for i := 0; i < vf_.len; i++ { |
| 894 | f, g := sincos(vf_[i]) |
| 895 | assert veryclose(sin_[i], f) |
| 896 | assert veryclose(cos_[i], g) |
| 897 | } |
| 898 | vfsin_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 899 | sin_sc_ := [nan(), copysign(0, -1), 0, nan(), nan()] |
| 900 | for i := 0; i < vfsin_sc_.len; i++ { |
| 901 | f, _ := sincos(vfsin_sc_[i]) |
| 902 | assert alike(sin_sc_[i], f) |
| 903 | } |
| 904 | vfcos_sc_ := [inf(-1), inf(1), nan()] |
| 905 | cos_sc_ := [nan(), nan(), nan()] |
| 906 | for i := 0; i < vfcos_sc_.len; i++ { |
| 907 | _, f := sincos(vfcos_sc_[i]) |
| 908 | assert alike(cos_sc_[i], f) |
| 909 | } |
| 910 | } |
| 911 | |
| 912 | fn test_sinh() { |
| 913 | for i := 0; i < vf_.len; i++ { |
| 914 | f := sinh(vf_[i]) |
| 915 | assert close(sinh_[i], f) |
| 916 | } |
| 917 | vfsinh_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 918 | sinh_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 919 | for i := 0; i < vfsinh_sc_.len; i++ { |
| 920 | f := sinh(vfsinh_sc_[i]) |
| 921 | assert alike(sinh_sc_[i], f) |
| 922 | } |
| 923 | } |
| 924 | |
| 925 | fn test_sqrt() { |
| 926 | for i := 0; i < vf_.len; i++ { |
| 927 | mut a := abs(vf_[i]) |
| 928 | mut f := sqrt(a) |
| 929 | assert veryclose(sqrt_[i], f) |
| 930 | a = abs(vf_[i]) |
| 931 | f = sqrt(a) |
| 932 | assert veryclose(sqrt_[i], f) |
| 933 | } |
| 934 | vfsqrt_sc_ := [inf(-1), -pi, copysign(0, -1), 0, inf(1), nan()] |
| 935 | sqrt_sc_ := [nan(), nan(), copysign(0, -1), 0, inf(1), nan()] |
| 936 | for i := 0; i < vfsqrt_sc_.len; i++ { |
| 937 | mut f := sqrt(vfsqrt_sc_[i]) |
| 938 | assert alike(sqrt_sc_[i], f) |
| 939 | f = sqrt(vfsqrt_sc_[i]) |
| 940 | assert alike(sqrt_sc_[i], f) |
| 941 | } |
| 942 | } |
| 943 | |
| 944 | fn test_tan() { |
| 945 | for i := 0; i < vf_.len; i++ { |
| 946 | f := tan(vf_[i]) |
| 947 | assert veryclose(tan_[i], f) |
| 948 | } |
| 949 | vfsin_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 950 | sin_sc_ := [nan(), copysign(0, -1), 0, nan(), nan()] |
| 951 | // same special cases as sin |
| 952 | for i := 0; i < vfsin_sc_.len; i++ { |
| 953 | f := tan(vfsin_sc_[i]) |
| 954 | assert alike(sin_sc_[i], f) |
| 955 | } |
| 956 | } |
| 957 | |
| 958 | fn test_tanh() { |
| 959 | for i := 0; i < vf_.len; i++ { |
| 960 | f := tanh(vf_[i]) |
| 961 | assert veryclose(tanh_[i], f) |
| 962 | } |
| 963 | vftanh_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 964 | tanh_sc_ := [f64(-1), copysign(0, -1), 0, 1, nan()] |
| 965 | for i := 0; i < vftanh_sc_.len; i++ { |
| 966 | f := tanh(vftanh_sc_[i]) |
| 967 | assert alike(tanh_sc_[i], f) |
| 968 | } |
| 969 | } |
| 970 | |
| 971 | fn test_trunc() { |
| 972 | // for i := 0; i < vf_.len; i++ { |
| 973 | // f := trunc(vf_[i]) |
| 974 | // assert alike(trunc_[i], f) |
| 975 | // } |
| 976 | vfceil_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 977 | ceil_sc_ := [inf(-1), copysign(0, -1), 0, inf(1), nan()] |
| 978 | for i := 0; i < vfceil_sc_.len; i++ { |
| 979 | f := trunc(vfceil_sc_[i]) |
| 980 | assert alike(ceil_sc_[i], f) |
| 981 | } |
| 982 | } |
| 983 | |
| 984 | fn test_gcd() { |
| 985 | assert gcd(6, 9) == 3 |
| 986 | assert gcd(6, -9) == 3 |
| 987 | assert gcd(-6, -9) == 3 |
| 988 | assert gcd(0, 0) == 0 |
| 989 | } |
| 990 | |
| 991 | fn test_egcd() { |
| 992 | helper := fn (a i64, b i64, expected_g i64) { |
| 993 | g, x, y := egcd(a, b) |
| 994 | assert g == expected_g |
| 995 | assert abs(a * x + b * y) == g |
| 996 | } |
| 997 | |
| 998 | helper(6, 9, 3) |
| 999 | helper(6, -9, 3) |
| 1000 | helper(-6, -9, 3) |
| 1001 | helper(0, 0, 0) |
| 1002 | } |
| 1003 | |
| 1004 | fn test_lcm() { |
| 1005 | assert lcm(2, 3) == 6 |
| 1006 | assert lcm(-2, 3) == 6 |
| 1007 | assert lcm(-2, -3) == 6 |
| 1008 | assert lcm(0, 0) == 0 |
| 1009 | } |
| 1010 | |
| 1011 | fn test_digits() { |
| 1012 | // a small sanity check with a known number like 100, |
| 1013 | // just written in different base systems: |
| 1014 | assert digits(100, reverse: true) == [1, 0, 0] |
| 1015 | assert digits(100, base: 2, reverse: true) == [1, 1, 0, 0, 1, 0, 0] |
| 1016 | assert digits(100, base: 3, reverse: true) == [1, 0, 2, 0, 1] |
| 1017 | assert digits(100, base: 4, reverse: true) == [1, 2, 1, 0] |
| 1018 | assert digits(100, base: 8, reverse: true) == [1, 4, 4] |
| 1019 | assert digits(100, base: 10, reverse: true) == [1, 0, 0] |
| 1020 | assert digits(100, base: 12, reverse: true) == [8, 4] |
| 1021 | assert digits(100, base: 16, reverse: true) == [6, 4] |
| 1022 | assert digits(100, base: 20, reverse: true) == [5, 0] |
| 1023 | assert digits(100, base: 32, reverse: true) == [3, 4] |
| 1024 | assert digits(100, base: 64, reverse: true) == [1, 36] |
| 1025 | assert digits(100, base: 128, reverse: true) == [100] |
| 1026 | assert digits(100, base: 256, reverse: true) == [100] |
| 1027 | |
| 1028 | assert digits(1234432112344321) == digits(1234432112344321, reverse: true) |
| 1029 | assert digits(1234432112344321) == [1, 2, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4, 4, 3, 2, 1] |
| 1030 | |
| 1031 | assert digits(125, base: 10, reverse: true) == [1, 2, 5] |
| 1032 | assert digits(125, base: 10).reverse() == [1, 2, 5] |
| 1033 | |
| 1034 | assert digits(15, base: 16, reverse: true) == [15] |
| 1035 | assert digits(127, base: 16, reverse: true) == [7, 15] |
| 1036 | assert digits(65535, base: 16, reverse: true) == [15, 15, 15, 15] |
| 1037 | assert digits(-65535, base: 16, reverse: true) == [-15, 15, 15, 15] |
| 1038 | |
| 1039 | assert digits(-127) == [7, 2, -1] |
| 1040 | assert digits(-127).reverse() == [-1, 2, 7] |
| 1041 | assert digits(-127, reverse: true) == [-1, 2, 7] |
| 1042 | |
| 1043 | assert digits(234, base: 7).reverse() == [4, 5, 3] |
| 1044 | |
| 1045 | assert digits(67432, base: 12).reverse() == [3, 3, 0, 3, 4] |
| 1046 | } |
| 1047 | |
| 1048 | // Check that math functions of high angle values |
| 1049 | // return accurate results. [since (vf_[i] + large) - large != vf_[i], |
| 1050 | // testing for Trig(vf_[i] + large) == Trig(vf_[i]), where large is |
| 1051 | // a multiple of 2 * pi, is misleading.] |
| 1052 | fn test_large_cos() { |
| 1053 | large := 100000.0 * pi |
| 1054 | for i := 0; i < vf_.len; i++ { |
| 1055 | f1 := cos_large_[i] |
| 1056 | f2 := cos(vf_[i] + large) |
| 1057 | assert soclose(f1, f2, 4e-8) |
| 1058 | } |
| 1059 | } |
| 1060 | |
| 1061 | fn test_large_sin() { |
| 1062 | large := 100000.0 * pi |
| 1063 | for i := 0; i < vf_.len; i++ { |
| 1064 | f1 := sin_large_[i] |
| 1065 | f2 := sin(vf_[i] + large) |
| 1066 | assert soclose(f1, f2, 4e-9) |
| 1067 | } |
| 1068 | } |
| 1069 | |
| 1070 | fn test_large_tan() { |
| 1071 | large := 100000.0 * pi |
| 1072 | for i := 0; i < vf_.len; i++ { |
| 1073 | f1 := tan_large_[i] |
| 1074 | f2 := tan(vf_[i] + large) |
| 1075 | assert soclose(f1, f2, 4e-8) |
| 1076 | } |
| 1077 | } |
| 1078 | |
| 1079 | fn test_sqrti() { |
| 1080 | assert sqrti(i64(123456789) * i64(123456789)) == 123456789 |
| 1081 | assert sqrti(144) == 12 |
| 1082 | assert sqrti(0) == 0 |
| 1083 | } |
| 1084 | |
| 1085 | fn test_powi() { |
| 1086 | assert powi(2, 62) == i64(4611686018427387904) |
| 1087 | assert powi(0, -2) == -1 // div by 0 |
| 1088 | assert powi(2, -1) == 0 |
| 1089 | } |
| 1090 | |
| 1091 | fn test_count_digits() { |
| 1092 | assert count_digits(-999) == 3 |
| 1093 | assert count_digits(-100) == 3 |
| 1094 | assert count_digits(-99) == 2 |
| 1095 | assert count_digits(-10) == 2 |
| 1096 | assert count_digits(-1) == 1 |
| 1097 | assert count_digits(0) == 1 |
| 1098 | assert count_digits(1) == 1 |
| 1099 | assert count_digits(10) == 2 |
| 1100 | assert count_digits(99) == 2 |
| 1101 | assert count_digits(100) == 3 |
| 1102 | assert count_digits(999) == 3 |
| 1103 | |
| 1104 | assert count_digits(12345) == 5 |
| 1105 | assert count_digits(123456789012345) == 15 |
| 1106 | assert count_digits(-67345) == 5 |
| 1107 | } |
| 1108 | |
| 1109 | fn test_min_max_int_str() { |
| 1110 | assert min_i64.str() == '-9223372036854775808' |
| 1111 | assert max_i64.str() == '9223372036854775807' |
| 1112 | assert min_i32.str() == '-2147483648' |
| 1113 | assert max_i32.str() == '2147483647' |
| 1114 | assert min_i16.str() == '-32768' |
| 1115 | assert max_i16.str() == '32767' |
| 1116 | assert min_i8.str() == '-128' |
| 1117 | assert max_i8.str() == '127' |
| 1118 | } |
| 1119 | |
| 1120 | fn test_maxof_minof() { |
| 1121 | assert maxof[i8]() == 127 |
| 1122 | assert maxof[i16]() == 32767 |
| 1123 | assert maxof[int]() == $if new_int ? && x64 { |
| 1124 | 9223372036854775807 |
| 1125 | } $else { |
| 1126 | 2147483647 |
| 1127 | } |
| 1128 | assert maxof[i32]() == 2147483647 |
| 1129 | assert maxof[i64]() == 9223372036854775807 |
| 1130 | assert maxof[u8]() == 255 |
| 1131 | assert maxof[u16]() == 65535 |
| 1132 | assert maxof[u32]() == 4294967295 |
| 1133 | assert maxof[u64]() == 18446744073709551615 |
| 1134 | assert maxof[f32]() == 3.40282346638528859811704183484516925440e+38 |
| 1135 | assert maxof[f64]() == 1.797693134862315708145274237317043567981e+308 |
| 1136 | |
| 1137 | assert minof[i8]() == -128 |
| 1138 | assert minof[i16]() == -32768 |
| 1139 | assert minof[int]() == $if new_int ? && x64 { |
| 1140 | -9223372036854775807 - 1 |
| 1141 | } $else { |
| 1142 | -2147483648 |
| 1143 | } |
| 1144 | assert minof[i32]() == -2147483648 |
| 1145 | assert minof[i64]() == -9223372036854775807 - 1 |
| 1146 | assert minof[u8]() == 0 |
| 1147 | assert minof[u16]() == 0 |
| 1148 | assert minof[u32]() == 0 |
| 1149 | assert minof[u64]() == 0 |
| 1150 | assert minof[f32]() == -3.40282346638528859811704183484516925440e+38 |
| 1151 | assert minof[f64]() == -1.797693134862315708145274237317043567981e+308 |
| 1152 | } |
| 1153 | |