+test.ha (46616B)
1 // SPDX-License-Identifier: MPL-2.0 2 // (c) Hare authors <https://harelang.org> 3 4 // The test data below is based on Go's implementation, and came with the 5 // following note and copyright notice: 6 // 7 // The expected results below were computed by the high precision calculators 8 // at https://keisan.casio.com/. More exact input values (array vf[], above) 9 // were obtained by printing them with "%.26f". The answers were calculated 10 // to 26 digits (by using the "Digit number" drop-down control of each 11 // calculator). 12 // 13 // The Go copyright notice: 14 // ==================================================== 15 // Copyright (c) 2009 The Go Authors. All rights reserved. 16 // 17 // Redistribution and use in source and binary forms, with or without 18 // modification, are permitted provided that the following conditions are 19 // met: 20 // 21 // * Redistributions of source code must retain the above copyright 22 // notice, this list of conditions and the following disclaimer. 23 // * Redistributions in binary form must reproduce the above 24 // copyright notice, this list of conditions and the following disclaimer 25 // in the documentation and/or other materials provided with the 26 // distribution. 27 // * Neither the name of Google Inc. nor the names of its 28 // contributors may be used to endorse or promote products derived from 29 // this software without specific prior written permission. 30 // 31 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 34 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 36 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 37 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 38 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 39 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 40 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 41 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 42 // ==================================================== 43 44 use math; 45 46 // The higher-precision values in VC26 were used to derive the 47 // input arguments VC. For reference only (do not delete). 48 const VC26: []c128 = [ 49 (4.97901192488367350108546816, 7.73887247457810456552351752), 50 (7.73887247457810456552351752, -0.27688005719200159404635997), 51 (-0.27688005719200159404635997, -5.01060361827107492160848778), 52 (-5.01060361827107492160848778, 9.63629370719841737980004837), 53 (9.63629370719841737980004837, 2.92637723924396464525443662), 54 (2.92637723924396464525443662, 5.22908343145930665230025625), 55 (5.22908343145930665230025625, 2.72793991043601025126008608), 56 (2.72793991043601025126008608, 1.82530809168085506044576505), 57 (1.82530809168085506044576505, -8.68592476857560136238589621), 58 (-8.68592476857560136238589621, 4.97901192488367350108546816), 59 ]; 60 61 const VC: []c128 = [ 62 (4.9790119248836735e+00, 7.7388724745781045e+00), 63 (7.7388724745781045e+00, -2.7688005719200159e-01), 64 (-2.7688005719200159e-01, -5.0106036182710749e+00), 65 (-5.0106036182710749e+00, 9.6362937071984173e+00), 66 (9.6362937071984173e+00, 2.9263772392439646e+00), 67 (2.9263772392439646e+00, 5.2290834314593066e+00), 68 (5.2290834314593066e+00, 2.7279399104360102e+00), 69 (2.7279399104360102e+00, 1.8253080916808550e+00), 70 (1.8253080916808550e+00, -8.6859247685756013e+00), 71 (-8.6859247685756013e+00, 4.9790119248836735e+00), 72 ]; 73 74 // The expected results below were computed by the high precision calculators 75 // at https://keisan.casio.com/. More exact input values (array vc[], above) 76 // were obtained by printing them with "%.26f". The answers were calculated 77 // to 26 digits (by using the "Digit number" drop-down control of each 78 // calculator). 79 80 const TEST_ABS: []f64 = [ 81 9.2022120669932650313380972e+00, 82 7.7438239742296106616261394e+00, 83 5.0182478202557746902556648e+00, 84 1.0861137372799545160704002e+01, 85 1.0070841084922199607011905e+01, 86 5.9922447613166942183705192e+00, 87 5.8978784056736762299945176e+00, 88 3.2822866700678709020367184e+00, 89 8.8756430028990417290744307e+00, 90 1.0011785496777731986390856e+01, 91 ]; 92 93 const TEST_ACOS: []c128 = [ 94 (1.0017679804707456328694569, -2.9138232718554953784519807), 95 (0.03606427612041407369636057, 2.7358584434576260925091256), 96 (1.6249365462333796703711823, 2.3159537454335901187730929), 97 (2.0485650849650740120660391, -3.0795576791204117911123886), 98 (0.29621132089073067282488147, -3.0007392508200622519398814), 99 (1.0664555914934156601503632, -2.4872865024796011364747111), 100 (0.48681307452231387690013905, -2.463655912283054555225301), 101 (0.6116977071277574248407752, -1.8734458851737055262693056), 102 (1.3649311280370181331184214, 2.8793528632328795424123832), 103 (2.6189310485682988308904501, -2.9956543302898767795858704), 104 ]; 105 106 const TEST_ACOSH: []c128 = [ 107 (2.9138232718554953784519807, 1.0017679804707456328694569), 108 (2.7358584434576260925091256, -0.03606427612041407369636057), 109 (2.3159537454335901187730929, -1.6249365462333796703711823), 110 (3.0795576791204117911123886, 2.0485650849650740120660391), 111 (3.0007392508200622519398814, 0.29621132089073067282488147), 112 (2.4872865024796011364747111, 1.0664555914934156601503632), 113 (2.463655912283054555225301, 0.48681307452231387690013905), 114 (1.8734458851737055262693056, 0.6116977071277574248407752), 115 (2.8793528632328795424123832, -1.3649311280370181331184214), 116 (2.9956543302898767795858704, 2.6189310485682988308904501), 117 ]; 118 119 const TEST_ASIN: []c128 = [ 120 (0.56902834632415098636186476, 2.9138232718554953784519807), 121 (1.5347320506744825455349611, -2.7358584434576260925091256), 122 (-0.054140219438483051139860579, -2.3159537454335901187730929), 123 (-0.47776875817017739283471738, 3.0795576791204117911123886), 124 (1.2745850059041659464064402, 3.0007392508200622519398814), 125 (0.50434073530148095908095852, 2.4872865024796011364747111), 126 (1.0839832522725827423311826, 2.463655912283054555225301), 127 (0.9590986196671391943905465, 1.8734458851737055262693056), 128 (0.20586519875787848611290031, -2.8793528632328795424123832), 129 (-1.0481347217734022116591284, 2.9956543302898767795858704), 130 ]; 131 132 const TEST_ASINH: []c128 = [ 133 (2.9113760469415295679342185, 0.99639459545704326759805893), 134 (2.7441755423994259061579029, -0.035468308789000500601119392), 135 (-2.2962136462520690506126678, -1.5144663565690151885726707), 136 (-3.0771233459295725965402455, 1.0895577967194013849422294), 137 (3.0048366100923647417557027, 0.29346979169819220036454168), 138 (2.4800059370795363157364643, 1.0545868606049165710424232), 139 (2.4718773838309585611141821, 0.47502344364250803363708842), 140 (1.8910743588080159144378396, 0.56882925572563602341139174), 141 (2.8735426423367341878069406, -1.362376149648891420997548), 142 (-2.9981750586172477217567878, 0.5183571985225367505624207), 143 ]; 144 145 const TEST_ATAN: []c128 = [ 146 (1.5115747079332741358607654, 0.091324403603954494382276776), 147 (1.4424504323482602560806727, -0.0045416132642803911503770933), 148 (-1.5593488703630532674484026, -0.20163295409248362456446431), 149 (-1.5280619472445889867794105, 0.081721556230672003746956324), 150 (1.4759909163240799678221039, 0.028602969320691644358773586), 151 (1.4877353772046548932715555, 0.14566877153207281663773599), 152 (1.4206983927779191889826, 0.076830486127880702249439993), 153 (1.3162236060498933364869556, 0.16031313000467530644933363), 154 (1.5473450684303703578810093, -0.11064907507939082484935782), 155 (-1.4841462340185253987375812, 0.049341850305024399493142411), 156 ]; 157 158 const TEST_ATANH: []c128 = [ 159 (0.058375027938968509064640438, 1.4793488495105334458167782), 160 (0.12977343497790381229915667, -1.5661009410463561327262499), 161 (-0.010576456067347252072200088, -1.3743698658402284549750563), 162 (-0.042218595678688358882784918, 1.4891433968166405606692604), 163 (0.095218997991316722061828397, 1.5416884098777110330499698), 164 (0.079965459366890323857556487, 1.4252510353873192700350435), 165 (0.15051245471980726221708301, 1.4907432533016303804884461), 166 (0.25082072933993987714470373, 1.392057665392187516442986), 167 (0.022896108815797135846276662, -1.4609224989282864208963021), 168 (-0.08665624101841876130537396, 1.5207902036935093480142159), 169 ]; 170 171 const TEST_CONJ: []c128 = [ 172 (4.9790119248836735e+00, -7.7388724745781045e+00), 173 (7.7388724745781045e+00, 2.7688005719200159e-01), 174 (-2.7688005719200159e-01, 5.0106036182710749e+00), 175 (-5.0106036182710749e+00, -9.6362937071984173e+00), 176 (9.6362937071984173e+00, -2.9263772392439646e+00), 177 (2.9263772392439646e+00, -5.2290834314593066e+00), 178 (5.2290834314593066e+00, -2.7279399104360102e+00), 179 (2.7279399104360102e+00, -1.8253080916808550e+00), 180 (1.8253080916808550e+00, 8.6859247685756013e+00), 181 (-8.6859247685756013e+00, -4.9790119248836735e+00), 182 ]; 183 184 const TEST_COS: []c128 = [ 185 (3.024540920601483938336569e+02, 1.1073797572517071650045357e+03), 186 (1.192858682649064973252758e-01, 2.7857554122333065540970207e-01), 187 (7.2144394304528306603857962e+01, -2.0500129667076044169954205e+01), 188 (2.24921952538403984190541e+03, -7.317363745602773587049329e+03), 189 (-9.148222970032421760015498e+00, 1.953124661113563541862227e+00), 190 (-9.116081175857732248227078e+01, -1.992669213569952232487371e+01), 191 (3.795639179042704640002918e+00, 6.623513350981458399309662e+00), 192 (-2.9144840732498869560679084e+00, -1.214620271628002917638748e+00), 193 (-7.45123482501299743872481e+02, 2.8641692314488080814066734e+03), 194 (-5.371977967039319076416747e+01, 4.893348341339375830564624e+01), 195 ]; 196 197 const TEST_COSH: []c128 = [ 198 (8.34638383523018249366948e+00, 7.2181057886425846415112064e+01), 199 (1.10421967379919366952251e+03, -3.1379638689277575379469861e+02), 200 (3.051485206773701584738512e-01, -2.6805384730105297848044485e-01), 201 (-7.33294728684187933370938e+01, 1.574445942284918251038144e+01), 202 (-7.478643293945957535757355e+03, 1.6348382209913353929473321e+03), 203 (4.622316522966235701630926e+00, -8.088695185566375256093098e+00), 204 (-8.544333183278877406197712e+01, 3.7505836120128166455231717e+01), 205 (-1.934457815021493925115198e+00, 7.3725859611767228178358673e+00), 206 (-2.352958770061749348353548e+00, -2.034982010440878358915409e+00), 207 (7.79756457532134748165069e+02, 2.8549350716819176560377717e+03), 208 ]; 209 210 const TEST_EXP: []c128 = [ 211 (1.669197736864670815125146e+01, 1.4436895109507663689174096e+02), 212 (2.2084389286252583447276212e+03, -6.2759289284909211238261917e+02), 213 (2.227538273122775173434327e-01, 7.2468284028334191250470034e-01), 214 (-6.5182985958153548997881627e-03, -1.39965837915193860879044e-03), 215 (-1.4957286524084015746110777e+04, 3.269676455931135688988042e+03), 216 (9.218158701983105935659273e+00, -1.6223985291084956009304582e+01), 217 (-1.7088175716853040841444505e+02, 7.501382609870410713795546e+01), 218 (-3.852461315830959613132505e+00, 1.4808420423156073221970892e+01), 219 (-4.586775503301407379786695e+00, -4.178501081246873415144744e+00), 220 (4.451337963005453491095747e-05, -1.62977574205442915935263e-04), 221 ]; 222 223 const TEST_LOG: []c128 = [ 224 (2.2194438972179194425697051e+00, 9.9909115046919291062461269e-01), 225 (2.0468956191154167256337289e+00, -3.5762575021856971295156489e-02), 226 (1.6130808329853860438751244e+00, -1.6259990074019058442232221e+00), 227 (2.3851910394823008710032651e+00, 2.0502936359659111755031062e+00), 228 (2.3096442270679923004800651e+00, 2.9483213155446756211881774e-01), 229 (1.7904660933974656106951860e+00, 1.0605860367252556281902109e+00), 230 (1.7745926939841751666177512e+00, 4.8084556083358307819310911e-01), 231 (1.1885403350045342425648780e+00, 5.8969634164776659423195222e-01), 232 (2.1833107837679082586772505e+00, -1.3636647724582455028314573e+00), 233 (2.3037629487273259170991671e+00, 2.6210913895386013290915234e+00), 234 ]; 235 236 const TEST_LOG10: []c128 = [ 237 (9.6389223745559042474184943e-01, 4.338997735671419492599631e-01), 238 (8.8895547241376579493490892e-01, -1.5531488990643548254864806e-02), 239 (7.0055210462945412305244578e-01, -7.0616239649481243222248404e-01), 240 (1.0358753067322445311676952e+00, 8.9043121238134980156490909e-01), 241 (1.003065742975330237172029e+00, 1.2804396782187887479857811e-01), 242 (7.7758954439739162532085157e-01, 4.6060666333341810869055108e-01), 243 (7.7069581462315327037689152e-01, 2.0882857371769952195512475e-01), 244 (5.1617650901191156135137239e-01, 2.5610186717615977620363299e-01), 245 (9.4819982567026639742663212e-01, -5.9223208584446952284914289e-01), 246 (1.0005115362454417135973429e+00, 1.1383255270407412817250921e+00), 247 ]; 248 249 const TEST_POLAR: []c128 = [ 250 (9.2022120669932650313380972e+00, 9.9909115046919291062461269e-01), 251 (7.7438239742296106616261394e+00, -3.5762575021856971295156489e-02), 252 (5.0182478202557746902556648e+00, -1.6259990074019058442232221e+00), 253 (1.0861137372799545160704002e+01, 2.0502936359659111755031062e+00), 254 (1.0070841084922199607011905e+01, 2.9483213155446756211881774e-01), 255 (5.9922447613166942183705192e+00, 1.0605860367252556281902109e+00), 256 (5.8978784056736762299945176e+00, 4.8084556083358307819310911e-01), 257 (3.2822866700678709020367184e+00, 5.8969634164776659423195222e-01), 258 (8.8756430028990417290744307e+00, -1.3636647724582455028314573e+00), 259 (1.0011785496777731986390856e+01, 2.6210913895386013290915234e+00), 260 ]; 261 262 const TEST_POW: []c128 = [ 263 (-2.499956739197529585028819e+00, 1.759751724335650228957144e+00), 264 (7.357094338218116311191939e+04, -5.089973412479151648145882e+04), 265 (1.320777296067768517259592e+01, -3.165621914333901498921986e+01), 266 (-3.123287828297300934072149e-07, -1.9849567521490553032502223e-7), 267 (8.0622651468477229614813e+04, -7.80028727944573092944363e+04), 268 (-1.0268824572103165858577141e+00, -4.716844738244989776610672e-01), 269 (-4.35953819012244175753187e+01, 2.2036445974645306917648585e+02), 270 (8.3556092283250594950239e-01, -1.2261571947167240272593282e+01), 271 (1.582292972120769306069625e+03, 1.273564263524278244782512e+04), 272 (6.592208301642122149025369e-08, 2.584887236651661903526389e-08), 273 ]; 274 275 const TEST_SIN: []c128 = [ 276 (-1.1073801774240233539648544e+03, 3.024539773002502192425231e+02), 277 (1.0317037521400759359744682e+00, -3.2208979799929570242818e-02), 278 (-2.0501952097271429804261058e+01, -7.2137981348240798841800967e+01), 279 (7.3173638080346338642193078e+03, 2.249219506193664342566248e+03), 280 (-1.964375633631808177565226e+00, -9.0958264713870404464159683e+00), 281 (1.992783647158514838337674e+01, -9.11555769410191350416942e+01), 282 (-6.680335650741921444300349e+00, 3.763353833142432513086117e+00), 283 (1.2794028166657459148245993e+00, -2.7669092099795781155109602e+00), 284 (2.8641693949535259594188879e+03, 7.451234399649871202841615e+02), 285 (-4.893811726244659135553033e+01, -5.371469305562194635957655e+01), 286 ]; 287 288 const TEST_SINH: []c128 = [ 289 (8.34559353341652565758198e+00, 7.2187893208650790476628899e+01), 290 (1.1042192548260646752051112e+03, -3.1379650595631635858792056e+02), 291 (-8.239469336509264113041849e-02, 9.9273668758439489098514519e-01), 292 (7.332295456982297798219401e+01, -1.574585908122833444899023e+01), 293 (-7.4786432301380582103534216e+03, 1.63483823493980029604071e+03), 294 (4.595842179016870234028347e+00, -8.135290105518580753211484e+00), 295 (-8.543842533574163435246793e+01, 3.750798997857594068272375e+01), 296 (-1.918003500809465688017307e+00, 7.4358344619793504041350251e+00), 297 (-2.233816733239658031433147e+00, -2.143519070805995056229335e+00), 298 (-7.797564130187551181105341e+02, -2.8549352346594918614806877e+03), 299 ]; 300 301 const TEST_SQRT: []c128 = [ 302 (2.6628203086086130543813948e+00, 1.4531345674282185229796902e+00), 303 (2.7823278427251986247149295e+00, -4.9756907317005224529115567e-02), 304 (1.5397025302089642757361015e+00, -1.6271336573016637535695727e+00), 305 (1.7103411581506875260277898e+00, 2.8170677122737589676157029e+00), 306 (3.1390392472953103383607947e+00, 4.6612625849858653248980849e-01), 307 (2.1117080764822417640789287e+00, 1.2381170223514273234967850e+00), 308 (2.3587032281672256703926939e+00, 5.7827111903257349935720172e-01), 309 (1.7335262588873410476661577e+00, 5.2647258220721269141550382e-01), 310 (2.3131094974708716531499282e+00, -1.8775429304303785570775490e+00), 311 (8.1420535745048086240947359e-01, 3.0575897587277248522656113e+00), 312 ]; 313 314 const TEST_TAN: []c128 = [ 315 (-1.928757919086441129134525e-07, 1.0000003267499169073251826e+00), 316 (1.242412685364183792138948e+00, -3.17149693883133370106696e+00), 317 (-4.6745126251587795225571826e-05, -9.9992439225263959286114298e-01), 318 (4.792363401193648192887116e-09, 1.0000000070589333451557723e+00), 319 (2.345740824080089140287315e-03, 9.947733046570988661022763e-01), 320 (-2.396030789494815566088809e-05, 9.9994781345418591429826779e-01), 321 (-7.370204836644931340905303e-03, 1.0043553413417138987717748e+00), 322 (-3.691803847992048527007457e-02, 9.6475071993469548066328894e-01), 323 (-2.781955256713729368401878e-08, -1.000000049848910609006646e+00), 324 (9.4281590064030478879791249e-05, 9.9999119340863718183758545e-01), 325 ]; 326 327 const TEST_TANH: []c128 = [ 328 (1.0000921981225144748819918e+00, 2.160986245871518020231507e-05), 329 (9.9999967727531993209562591e-01, -1.9953763222959658873657676e-07), 330 (-1.765485739548037260789686e+00, 1.7024216325552852445168471e+00), 331 (-9.999189442732736452807108e-01, 3.64906070494473701938098e-05), 332 (9.9999999224622333738729767e-01, -3.560088949517914774813046e-09), 333 (1.0029324933367326862499343e+00, -4.948790309797102353137528e-03), 334 (9.9996113064788012488693567e-01, -4.226995742097032481451259e-05), 335 (1.0074784189316340029873945e+00, -4.194050814891697808029407e-03), 336 (9.9385534229718327109131502e-01, 5.144217985914355502713437e-02), 337 (-1.0000000491604982429364892e+00, -2.901873195374433112227349e-08), 338 ]; 339 340 // huge values along the real axis for testing reducepi in tan 341 const TEST_HUGEIN: []c128 = [ 342 ((1u64 << 28): f64, 0f64), 343 ((1u64 << 29): f64, 0f64), 344 ((1u64 << 30): f64, 0f64), 345 ((1u64 << 35): f64, 0f64), 346 (-1.329227995784916e+36, 0f64), 347 (1.7668470647783843e+72, 0f64), 348 (2.037035976334486e+90, 0f64), 349 (-3.1217485503159922e+144, 0f64), 350 (1.8919697882131776e+69, 0f64), 351 (-2.514859209672214e+105, 0f64), 352 ]; 353 354 // Results for TEST_TANHUGE[i] calculated with https://github.com/robpike/ivy 355 // using 4096 bits of working precision. 356 const TEST_TANHUGE: []c128 = [ 357 ((5.95641897939639421): f64, 0f64), 358 ((-0.34551069233430392): f64, 0f64), 359 ((-0.78469661331920043): f64, 0f64), 360 ((0.84276385870875983): f64, 0f64), 361 ((0.40806638884180424): f64, 0f64), 362 ((-0.37603456702698076): f64, 0f64), 363 ((4.60901287677810962): f64, 0f64), 364 ((3.39135965054779932): f64, 0f64), 365 ((-6.76813854009065030): f64, 0f64), 366 ((-0.76417695016604922): f64, 0f64), 367 ]; 368 369 const TEST_VCABSSC: []c128 = [ 370 (math::NAN, math::NAN), 371 ]; 372 373 const TEST_ABSSC: []f64 = [ 374 math::NAN, 375 ]; 376 377 const TEST_ACOSSC: [](c128, c128) = [ 378 // G.6.1.1 379 ((0f64, 0f64), 380 (math::PI / 2f64, -0f64)), 381 ((-0f64, 0f64), 382 (math::PI / 2f64, -0f64)), 383 ((0f64, math::NAN), 384 (math::PI / 2f64, math::NAN)), 385 ((-0f64, math::NAN), 386 (math::PI / 2f64, math::NAN)), 387 ((1f64, math::INF), 388 (math::PI / 2f64, -math::INF)), 389 ((1f64, math::NAN), 390 (math::NAN, math::NAN)), 391 ((-math::INF, 1f64), 392 (math::PI, -math::INF)), 393 ((math::INF, 1f64), 394 (0f64, -math::INF)), 395 ((-math::INF, math::INF), 396 (3f64 * math::PI / 4f64, -math::INF)), 397 ((math::INF, math::INF), 398 (math::PI / 4f64, -math::INF)), 399 ((math::INF, math::NAN), 400 (math::NAN, -math::INF)), // imaginary sign unspecified 401 ((-math::INF, math::NAN), 402 (math::NAN, math::INF)), // imaginary sign unspecified 403 ((math::NAN, 1f64), 404 (math::NAN, math::NAN)), 405 ((math::NAN, math::INF), 406 (math::NAN, -math::INF)), 407 ((math::NAN, math::NAN), 408 (math::NAN, math::NAN)), 409 ]; 410 411 const TEST_ACOSHSC: [](c128, c128) = [ 412 // G.6.2.1 413 ((0f64, 0f64), 414 (0f64, math::PI / 2f64)), 415 ((-0f64, 0f64), 416 (0f64, math::PI / 2f64)), 417 ((1f64, math::INF), 418 (math::INF, math::PI / 2f64)), 419 ((1f64, math::NAN), 420 (math::NAN, math::NAN)), 421 ((-math::INF, 1f64), 422 (math::INF, math::PI)), 423 ((math::INF, 1f64), 424 (math::INF, 0f64)), 425 ((-math::INF, math::INF), 426 (math::INF, 3f64 * math::PI / 4f64)), 427 ((math::INF, math::INF), 428 (math::INF, math::PI / 4f64)), 429 ((math::INF, math::NAN), 430 (math::INF, math::NAN)), 431 ((-math::INF, math::NAN), 432 (math::INF, math::NAN)), 433 ((math::NAN, 1f64), 434 (math::NAN, math::NAN)), 435 ((math::NAN, math::INF), 436 (math::INF, math::NAN)), 437 ((math::NAN, math::NAN), 438 (math::NAN, math::NAN)), 439 ]; 440 441 const TEST_ASINSC: [](c128, c128) = [ 442 // Derived from Asin(z) = -i * Asinh(i * z), G.6 #7 443 ((0f64, 0f64), 444 (0f64, 0f64)), 445 ((1f64, math::INF), 446 (0f64, math::INF)), 447 ((1f64, math::NAN), 448 (math::NAN, math::NAN)), 449 ((math::INF, 1f64), 450 (math::PI / 2f64, math::INF)), 451 ((math::INF, math::INF), 452 (math::PI / 4f64, math::INF)), 453 ((math::INF, math::NAN), 454 (math::NAN, math::INF)), // imaginary sign unspecified 455 ((math::NAN, 0f64), 456 (math::NAN, math::NAN)), 457 ((math::NAN, 1f64), 458 (math::NAN, math::NAN)), 459 ((math::NAN, math::INF), 460 (math::NAN, math::INF)), 461 ((math::NAN, math::NAN), 462 (math::NAN, math::NAN)), 463 ]; 464 465 const TEST_ASINHSC: [](c128, c128) = [ 466 // G.6.2.2 467 ((0f64, 0f64), 468 (0f64, 0f64)), 469 ((1f64, math::INF), 470 (math::INF, math::PI / 2f64)), 471 ((1f64, math::NAN), 472 (math::NAN, math::NAN)), 473 ((math::INF, 1f64), 474 (math::INF, 0f64)), 475 ((math::INF, math::INF), 476 (math::INF, math::PI / 4f64)), 477 ((math::INF, math::NAN), 478 (math::INF, math::NAN)), 479 ((math::NAN, 0f64), 480 (math::NAN, 0f64)), 481 ((math::NAN, 1f64), 482 (math::NAN, math::NAN)), 483 ((math::NAN, math::INF), 484 (math::INF, math::NAN)), // sign of real part unspecified 485 ((math::NAN, math::NAN), 486 (math::NAN, math::NAN)), 487 ]; 488 489 const TEST_ATANSC: [](c128, c128) = [ 490 // Derived from Atan(z) = -i * Atanh(i * z), G.6 #7 491 ((0f64, 0f64), 492 (0f64, 0f64)), 493 ((0f64, math::NAN), 494 (math::NAN, math::NAN)), 495 ((1f64, 0f64), 496 (math::PI / 4f64, 0f64)), 497 ((1f64, math::INF), 498 (math::PI / 2f64, 0f64)), 499 ((1f64, math::NAN), 500 (math::NAN, math::NAN)), 501 ((math::INF, 1f64), 502 (math::PI / 2f64, 0f64)), 503 ((math::INF, math::INF), 504 (math::PI / 2f64, 0f64)), 505 ((math::INF, math::NAN), 506 (math::PI / 2f64, 0f64)), 507 ((math::NAN, 1f64), 508 (math::NAN, math::NAN)), 509 ((math::NAN, math::INF), 510 (math::NAN, 0f64)), 511 ((math::NAN, math::NAN), 512 (math::NAN, math::NAN)), 513 ]; 514 515 const TEST_ATANHSC: [](c128, c128) = [ 516 // G.6.2.3 517 ((0f64, 0f64), 518 (0f64, 0f64)), 519 ((0f64, math::NAN), 520 (0f64, math::NAN)), 521 ((1f64, 0f64), 522 (math::INF, 0f64)), 523 ((1f64, math::INF), 524 (0f64, math::PI / 2f64)), 525 ((1f64, math::NAN), 526 (math::NAN, math::NAN)), 527 ((math::INF, 1f64), 528 (0f64, math::PI / 2f64)), 529 ((math::INF, math::INF), 530 (0f64, math::PI / 2f64)), 531 ((math::INF, math::NAN), 532 (0f64, math::NAN)), 533 ((math::NAN, 1f64), 534 (math::NAN, math::NAN)), 535 ((math::NAN, math::NAN), 536 (0f64, math::PI / 2f64)), // sign of real part not specified. 537 ((math::NAN, math::NAN), 538 (math::NAN, math::NAN)), 539 ]; 540 541 const TEST_VCCONJSC: []c128 = [ 542 (math::NAN, math::NAN), 543 ]; 544 545 const TEST_CONJSC: []c128 = [ 546 (math::NAN, math::NAN), 547 ]; 548 549 const TEST_COSSC: [](c128, c128) = [ 550 // Derived from Cos(z) = Cosh(i * z), G.6 #7 551 ((0f64, 0f64), 552 (1f64, -0f64)), 553 ((0f64, math::INF), 554 (math::INF, -0f64)), 555 ((0f64, math::NAN), 556 (math::NAN, 0f64)), // imaginary sign unspecified 557 ((1f64, math::INF), 558 (math::INF, -math::INF)), 559 ((1f64, math::NAN), 560 (math::NAN, math::NAN)), 561 ((math::INF, 0f64), 562 (math::NAN, -0f64)), 563 ((math::INF, 1f64), 564 (math::NAN, math::NAN)), 565 ((math::INF, math::INF), 566 (math::INF, math::NAN)), // real sign unspecified 567 ((math::INF, math::NAN), 568 (math::NAN, math::NAN)), 569 ((math::NAN, 0f64), 570 (math::NAN, -0f64)), // imaginary sign unspecified 571 ((math::NAN, 1f64), 572 (math::NAN, math::NAN)), 573 ((math::NAN, math::INF), 574 (math::INF, math::NAN)), 575 ((math::NAN, math::NAN), 576 (math::NAN, math::NAN)), 577 ]; 578 579 const TEST_COSHSC: [](c128, c128) = [ 580 // G.6.2.4 581 ((0f64, 0f64), 582 (1f64, 0f64)), 583 ((0f64, math::INF), 584 (math::NAN, 0f64)), // imaginary sign unspecified 585 ((0f64, math::NAN), 586 (math::NAN, 0f64)), // imaginary sign unspecified 587 ((1f64, math::INF), 588 (math::NAN, math::NAN)), 589 ((1f64, math::NAN), 590 (math::NAN, math::NAN)), 591 ((math::INF, 0f64), 592 (math::INF, 0f64)), 593 ((math::INF, 1f64), 594 (math::INF, math::INF)), // +(math::INF, 0f64) cis(y) 595 ((math::INF, math::INF), 596 (math::INF, math::NAN)), // real sign unspecified 597 ((math::INF, math::NAN), 598 (math::INF, math::NAN)), 599 ((math::NAN, 0f64), 600 (math::NAN, 0f64)), // imaginary sign unspecified 601 ((math::NAN, 1f64), 602 (math::NAN, math::NAN)), 603 ((math::NAN, math::INF), 604 (math::NAN, math::NAN)), 605 ((math::NAN, math::NAN), 606 (math::NAN, math::NAN)), 607 ]; 608 609 const TEST_EXPSC: [](c128, c128) = [ 610 // G.6.3.1 611 ((0f64, 0f64), 612 (1f64, 0f64)), 613 ((-0f64, 0f64), 614 (1f64, 0f64)), 615 ((1f64, math::INF), 616 (math::NAN, math::NAN)), 617 ((1f64, math::NAN), 618 (math::NAN, math::NAN)), 619 ((math::INF, 0f64), 620 (math::INF, 0f64)), 621 ((-math::INF, 1f64), 622 (0f64, 0f64)), 623 ((math::INF, 1f64), 624 (math::INF, math::INF)), 625 ((-math::INF, math::INF), 626 (0f64, 0f64)), // real and imaginary sign unspecified 627 ((math::INF, math::INF), 628 (math::INF, math::NAN)), // real sign unspecified 629 ((-math::INF, math::NAN), 630 (0f64, 0f64)), // real and imaginary sign unspecified 631 ((math::INF, math::NAN), 632 (math::INF, math::NAN)), // real sign unspecified 633 ((math::NAN, 0f64), 634 (math::NAN, 0f64)), 635 ((math::NAN, 1f64), 636 (math::NAN, math::NAN)), 637 ((math::NAN, math::INF), 638 (math::NAN, math::NAN)), 639 ((math::NAN, math::NAN), 640 (math::NAN, math::NAN)), 641 ]; 642 643 const TEST_VCISNANSC: []c128 = [ 644 (-math::INF, -math::INF), 645 (-math::INF, math::NAN), 646 (math::NAN, -math::INF), 647 (0f64, math::NAN), 648 (math::NAN, 0f64), 649 (math::INF, math::INF), 650 (math::INF, math::NAN), 651 (math::NAN, math::INF), 652 (math::NAN, math::NAN), 653 ]; 654 655 const TEST_ISNANSC: []bool = [ 656 false, 657 false, 658 false, 659 true, 660 true, 661 false, 662 false, 663 false, 664 true, 665 ]; 666 667 // XXX: math::PI doesn't have suitable precision here for some reason 668 const TEST_LOGSC: [](c128, c128) = [ 669 // G.6.3.2 670 ((0f64, 0f64), 671 (-math::INF, 0f64)), 672 //((-0f64, 0f64), 673 // (-math::INF, math::PI)), 674 //((1f64, math::INF), 675 // (math::INF, math::PI / 2f64)), 676 ((1f64, math::NAN), 677 (math::NAN, math::NAN)), 678 //((-math::INF, 1f64), 679 // (math::INF, math::PI)), 680 ((math::INF, 1f64), 681 (math::INF, 0f64)), 682 //((-math::INF, math::INF), 683 // (math::INF, 3f64 * math::PI / 4f64)), 684 //((math::INF, math::INF), 685 // (math::INF, math::PI / 4f64)), 686 ((-math::INF, math::NAN), 687 (math::INF, math::NAN)), 688 ((math::INF, math::NAN), 689 (math::INF, math::NAN)), 690 ((math::NAN, 1f64), 691 (math::NAN, math::NAN)), 692 ((math::NAN, math::INF), 693 (math::INF, math::NAN)), 694 ((math::NAN, math::NAN), 695 (math::NAN, math::NAN)), 696 ]; 697 698 const TEST_LOG10SC: [](c128, c128) = [ 699 // derived from Log special cases via Log10(x) = math.Log10E*Log(x) 700 ((0f64, 0f64), 701 (-math::INF, 0f64)), 702 ((-0f64, 0f64), 703 (-math::INF, math::LOG10_E * math::PI)), 704 ((1f64, math::INF), 705 (math::INF, math::LOG10_E * math::PI / 2f64)), 706 ((1f64, math::NAN), 707 (math::NAN, math::NAN)), 708 ((-math::INF, 1f64), 709 (math::INF, math::LOG10_E * math::PI)), 710 ((math::INF, 1f64), 711 (math::INF, 0f64)), 712 ((-math::INF, math::INF), 713 (math::INF, math::LOG10_E * 3f64 * math::PI / 4f64)), 714 ((math::INF, math::INF), 715 (math::INF, math::LOG10_E * math::PI / 4f64)), 716 ((-math::INF, math::NAN), 717 (math::INF, math::NAN)), 718 ((math::INF, math::NAN), 719 (math::INF, math::NAN)), 720 ((math::NAN, 1f64), 721 (math::NAN, math::NAN)), 722 ((math::NAN, math::INF), 723 (math::INF, math::NAN)), 724 ((math::NAN, math::NAN), 725 (math::NAN, math::NAN)), 726 ]; 727 728 const TEST_VCPOLARSC: []c128 = [ 729 (math::NAN, math::NAN), 730 ]; 731 732 const TEST_POLARSC: [](f64, f64) = [ 733 (math::NAN, math::NAN), 734 ]; 735 736 const TEST_VCPOWSC: [](c128, c128) = [ 737 ((math::NAN, math::NAN), (math::NAN, math::NAN)), 738 ((0f64, 0f64), (math::NAN, math::NAN)), 739 ]; 740 741 const TEST_POWSC: []c128 = [ 742 (math::NAN, math::NAN), 743 (math::NAN, math::NAN), 744 ]; 745 746 const TEST_SINSC: [](c128, c128) = [ 747 // Derived from Sin(z) = -i * Sinh(i * z), G.6 #7 748 ((0f64, 0f64), 749 (0f64, 0f64)), 750 ((0f64, math::INF), 751 (0f64, math::INF)), 752 ((0f64, math::NAN), 753 (0f64, math::NAN)), 754 ((1f64, math::INF), 755 (math::INF, math::INF)), 756 ((1f64, math::NAN), 757 (math::NAN, math::NAN)), 758 ((math::INF, 0f64), 759 (math::NAN, 0f64)), 760 ((math::INF, 1f64), 761 (math::NAN, math::NAN)), 762 ((math::INF, math::INF), 763 (math::NAN, math::INF)), 764 ((math::INF, math::NAN), 765 (math::NAN, math::NAN)), 766 ((math::NAN, 0f64), 767 (math::NAN, 0f64)), 768 ((math::NAN, 1f64), 769 (math::NAN, math::NAN)), 770 ((math::NAN, math::INF), 771 (math::NAN, math::INF)), 772 ((math::NAN, math::NAN), 773 (math::NAN, math::NAN)), 774 ]; 775 776 const TEST_SINHSC: [](c128, c128) = [ 777 // G.6.2.5 778 ((0f64, 0f64), 779 (0f64, 0f64)), 780 ((0f64, math::INF), 781 (0f64, math::NAN)), // real sign unspecified 782 ((0f64, math::NAN), 783 (0f64, math::NAN)), // real sign unspecified 784 ((1f64, math::INF), 785 (math::NAN, math::NAN)), 786 ((1f64, math::NAN), 787 (math::NAN, math::NAN)), 788 ((math::INF, 0f64), 789 (math::INF, 0f64)), 790 ((math::INF, 1f64), 791 (math::INF, math::INF)), // +math::INF cis(y) 792 ((math::INF, math::INF), 793 (math::INF, math::NAN)), // real sign unspecified 794 ((math::INF, math::NAN), 795 (math::INF, math::NAN)), // real sign unspecified 796 ((math::NAN, 0f64), 797 (math::NAN, 0f64)), 798 ((math::NAN, 1f64), 799 (math::NAN, math::NAN)), 800 ((math::NAN, math::INF), 801 (math::NAN, math::NAN)), 802 ((math::NAN, math::NAN), 803 (math::NAN, math::NAN)), 804 ]; 805 806 const TEST_SQRTSC: [](c128, c128) = [ 807 // G.6.4.2 808 ((0f64, 0f64), 809 (0f64, 0f64)), 810 ((-0f64, 0f64), 811 (0f64, 0f64)), 812 ((1f64, math::INF), 813 (math::INF, math::INF)), 814 ((math::NAN, math::INF), 815 (math::INF, math::INF)), 816 ((1f64, math::NAN), 817 (math::NAN, math::NAN)), 818 ((-math::INF, 1f64), 819 (0f64, math::INF)), 820 ((math::INF, 1f64), 821 (math::INF, 0f64)), 822 ((-math::INF, math::NAN), 823 (math::NAN, math::INF)), // imaginary sign unspecified 824 ((math::INF, math::NAN), 825 (math::INF, math::NAN)), 826 ((math::NAN, 1f64), 827 (math::NAN, math::NAN)), 828 ((math::NAN, math::NAN), 829 (math::NAN, math::NAN)), 830 ]; 831 832 const TEST_TANSC: [](c128, c128) = [ 833 // Derived from Tan(z) = -i * Tanh(i * z), G.6 #7 834 ((0f64, 0f64), 835 (0f64, 0f64)), 836 ((0f64, math::NAN), 837 (0f64, math::NAN)), 838 ((1f64, math::INF), 839 (0f64, 1f64)), 840 ((1f64, math::NAN), 841 (math::NAN, math::NAN)), 842 ((math::INF, 1f64), 843 (math::NAN, math::NAN)), 844 ((math::INF, math::INF), 845 (0f64, 1f64)), 846 ((math::INF, math::NAN), 847 (math::NAN, math::NAN)), 848 ((math::NAN, 0f64), 849 (math::NAN, math::NAN)), 850 ((math::NAN, 1f64), 851 (math::NAN, math::NAN)), 852 ((math::NAN, math::INF), 853 (0f64, 1f64)), 854 ((math::NAN, math::NAN), 855 (math::NAN, math::NAN)), 856 ]; 857 858 const TEST_TANHSC: [](c128, c128) = [ 859 // G.6.2.6 860 ((0f64, 0f64), 861 (0f64, 0f64)), 862 ((1f64, math::INF), 863 (math::NAN, math::NAN)), 864 ((1f64, math::NAN), 865 (math::NAN, math::NAN)), 866 ((math::INF, 1f64), 867 (1f64, 0f64)), // 1 + i 0 sin(2y) 868 ((math::INF, math::INF), 869 (1f64, 0f64)), // imaginary sign unspecified 870 ((math::INF, math::NAN), 871 (1f64, 0f64)), // imaginary sign unspecified 872 ((math::NAN, 0f64), 873 (math::NAN, 0f64)), 874 ((math::NAN, 1f64), 875 (math::NAN, math::NAN)), 876 ((math::NAN, math::INF), 877 (math::NAN, math::NAN)), 878 ((math::NAN, math::NAN), 879 (math::NAN, math::NAN)), 880 ]; 881 882 // branch cut continuity checks 883 // points on each axis at |z| > 1 are checked for one-sided continuity from both 884 // the positive and negative side 885 // all possible branch cuts for the elementary functions are at one of these 886 // points 887 888 def EPS: f64 = 1f64 / (1u64 << 53): f64; 889 890 const BRANCHPOINTS: [](c128, c128) = [ 891 ((2f64, 0f64), (2f64, EPS)), 892 ((2f64, -0f64), (2f64, -EPS)), 893 ((-2.0, 0f64), (-2.0, EPS)), 894 ((-2.0, -0f64), (-2.0, -EPS)), 895 ((0f64, 2f64), (EPS, 2f64)), 896 ((-0f64, 2f64), (-EPS, 2f64)), 897 ((0f64, -2.0), (EPS, -2.0)), 898 ((-0f64, -2.0), (-EPS, -2.0)), 899 ]; 900 901 fn tolerance(actual: f64, expected: f64, e: f64) bool = { 902 const err = math::absf64(actual - expected); 903 if (expected != 0f64) { 904 e = math::absf64(e * expected); 905 }; 906 return err < e; 907 }; 908 909 fn veryclose(a: f64, b: f64) bool = tolerance(a, b, 4e-16); 910 911 fn alike(a: f64, b: f64) bool = { 912 if (math::isnan(a) && math::isnan(b)) { 913 return true; 914 }; 915 if (a == b) { 916 return math::signf64(a) == math::signf64(b); 917 }; 918 return false; 919 }; 920 921 fn csoclose(a: c128, b: c128, e: f64) bool = { 922 const d = absc128(subc128(a, b)); 923 if (b.0 != 0f64 || b.1 != 0f64) { 924 e *= absc128(b); 925 if (e < 0f64) { 926 e = -e; 927 }; 928 }; 929 return d < e; 930 }; 931 932 fn cveryclose(a: c128, b: c128) bool = csoclose(a, b, 4e-16); 933 934 fn calike(a: c128, b: c128) bool = { 935 let realalike = false, imagalike = false; 936 realalike = if (isexact(b.0)) { 937 yield alike(a.0, b.0); 938 } else { 939 // Allow non-exact special cases to have errors in ULP. 940 yield veryclose(a.0, b.0); 941 }; 942 imagalike = if (isexact(b.1)) { 943 yield alike(a.1, b.1); 944 } else { 945 // Allow non-exact special cases to have errors in ULP. 946 yield veryclose(a.1, b.1); 947 }; 948 return realalike && imagalike; 949 }; 950 951 // Special cases that should match exactly. Other cases are multiples of pi that 952 // may not be last bit identical on all platforms. 953 fn isexact(x: f64) bool = 954 math::isnan(x) || math::isinf(x) || x == 0f64 || x == 1f64 || x == -1f64; 955 956 @test fn abs() void = { 957 for (let i = 0z; i < len(VC); i += 1) { 958 assert(veryclose(TEST_ABS[i], absc128(VC[i]))); 959 }; 960 for (let i = 0z; i < len(TEST_VCABSSC); i += 1) { 961 assert(alike(TEST_ABSSC[i], absc128(TEST_VCABSSC[i]))); 962 }; 963 }; 964 965 @test fn acos() void = { 966 for (let i = 0z; i < len(VC); i += 1) { 967 // XXX: should have 1e-14 precision 968 assert(csoclose(TEST_ACOS[i], acosc128(VC[i]), 1e-7)); 969 }; 970 for (let i = 0z; i < len(TEST_ACOSSC); i += 1) { 971 const v = TEST_ACOSSC[i]; 972 assert(calike(v.1, acosc128(v.0))); 973 if (math::isnan(v.0.1) || math::isnan(v.1.1)) { 974 // Negating NaN is undefined with regard to the sign bit 975 // produced. 976 continue; 977 }; 978 // acos(conj(z)) == conj(acos(z)) 979 assert(calike(conjc128(v.1), acosc128(conjc128(v.0))) 980 || calike(v.0, conjc128(v.0))); 981 }; 982 for (let i = 0z; i < len(BRANCHPOINTS); i += 1) { 983 const pt = BRANCHPOINTS[i]; 984 assert(cveryclose(acosc128(pt.0), acosc128(pt.1))); 985 }; 986 }; 987 988 @test fn acosh() void = { 989 for (let i = 0z; i < len(VC); i += 1) { 990 // XXX: should have 1e-14 precision 991 assert(csoclose(TEST_ACOSH[i], acoshc128(VC[i]), 1e-7)); 992 }; 993 for (let i = 0z; i < len(TEST_ACOSHSC); i += 1) { 994 const v = TEST_ACOSHSC[i]; 995 assert(calike(v.1, acoshc128(v.0))); 996 if (math::isnan(v.0.1) || math::isnan(v.1.1)) { 997 // Negating NaN is undefined with regard to the sign bit 998 // produced. 999 continue; 1000 }; 1001 // acosh(conj(z)) == conj(acosh(z)) 1002 assert(calike(conjc128(v.1), acoshc128(conjc128(v.0))) 1003 || calike(v.0, conjc128(v.0))); 1004 }; 1005 for (let i = 0z; i < len(BRANCHPOINTS); i += 1) { 1006 const pt = BRANCHPOINTS[i]; 1007 assert(cveryclose(acoshc128(pt.0), acoshc128(pt.1))); 1008 }; 1009 }; 1010 1011 @test fn asin() void = { 1012 for (let i = 0z; i < len(VC); i += 1) { 1013 assert(csoclose(TEST_ASIN[i], asinc128(VC[i]), 1e-14)); 1014 }; 1015 for (let i = 0z; i < len(TEST_ASINSC); i += 1) { 1016 const v = TEST_ASINSC[i]; 1017 assert(calike(v.1, asinc128(v.0))); 1018 if (math::isnan(v.0.1) || math::isnan(v.1.1)) { 1019 // Negating NaN is undefined with regard to the sign bit 1020 // produced. 1021 continue; 1022 }; 1023 // asin(conj(z)) == asin(sinh(z)) 1024 assert(calike(conjc128(v.1), asinc128(conjc128(v.0))) 1025 || calike(v.0, conjc128(v.0))); 1026 if (math::isnan(v.0.0) || math::isnan(v.1.0)) { 1027 // Negating NaN is undefined with regard to the sign bit 1028 // produced. 1029 continue; 1030 }; 1031 // asin(-z) == -asin(z) 1032 assert(calike((-v.1.0, -v.1.1), asinc128((-v.0.0, -v.0.1))) 1033 || calike(v.0, (-v.0.0, -v.0.1))); 1034 }; 1035 for (let i = 0z; i < len(BRANCHPOINTS); i += 1) { 1036 const pt = BRANCHPOINTS[i]; 1037 assert(cveryclose(asinc128(pt.0), asinc128(pt.1))); 1038 }; 1039 }; 1040 1041 @test fn asinh() void = { 1042 for (let i = 0z; i < len(VC); i += 1) { 1043 assert(csoclose(TEST_ASINH[i], asinhc128(VC[i]), 4e-15)); 1044 }; 1045 for (let i = 0z; i < len(TEST_ASINHSC); i += 1) { 1046 const v = TEST_ASINHSC[i]; 1047 assert(calike(v.1, asinhc128(v.0))); 1048 if (math::isnan(v.0.1) || math::isnan(v.1.1)) { 1049 // Negating NaN is undefined with regard to the sign bit 1050 // produced. 1051 continue; 1052 }; 1053 // asinh(conj(z)) == asinh(sinh(z)) 1054 assert(calike(conjc128(v.1), asinhc128(conjc128(v.0))) 1055 || calike(v.0, conjc128(v.0))); 1056 if (math::isnan(v.0.0) || math::isnan(v.1.0)) { 1057 // Negating NaN is undefined with regard to the sign bit 1058 // produced. 1059 continue; 1060 }; 1061 // asinh(-z) == -asinh(z) 1062 assert(calike((-v.1.0, -v.1.1), asinhc128((-v.0.0, -v.0.1))) 1063 || calike(v.0, (-v.0.0, -v.0.1))); 1064 }; 1065 for (let i = 0z; i < len(BRANCHPOINTS); i += 1) { 1066 const pt = BRANCHPOINTS[i]; 1067 assert(cveryclose(asinhc128(pt.0), asinhc128(pt.1))); 1068 }; 1069 }; 1070 1071 @test fn atan() void = { 1072 for (let i = 0z; i < len(VC); i += 1) { 1073 assert(cveryclose(TEST_ATAN[i], atanc128(VC[i]))); 1074 }; 1075 for (let i = 0z; i < len(TEST_ATANSC); i += 1) { 1076 const v = TEST_ATANSC[i]; 1077 if (math::isnan(v.0.1) || math::isnan(v.1.1)) { 1078 // Negating NaN is undefined with regard to the sign bit 1079 // produced. 1080 continue; 1081 }; 1082 assert(calike(v.1, atanc128(v.0))); 1083 // atan(conj(z)) == conj(atan(z)) 1084 assert(calike(conjc128(v.1), atanc128(conjc128(v.0))) 1085 || calike(v.0, conjc128(v.0))); 1086 if (math::isnan(v.0.0) || math::isnan(v.1.0)) { 1087 // Negating NaN is undefined with regard to the sign bit 1088 // produced. 1089 continue; 1090 }; 1091 // atan(-z) == -atan(z) 1092 assert(calike((-v.1.0, -v.1.1), atanc128((-v.0.0, -v.0.1))) 1093 || calike((v.0), conjc128(v.0))); 1094 }; 1095 for (let i = 0z; i < len(BRANCHPOINTS); i += 1) { 1096 const pt = BRANCHPOINTS[i]; 1097 assert(cveryclose(atanc128(pt.0), atanc128(pt.1))); 1098 }; 1099 }; 1100 1101 @test fn atanh() void = { 1102 for (let i = 0z; i < len(VC); i += 1) { 1103 assert(cveryclose(TEST_ATANH[i], atanhc128(VC[i]))); 1104 }; 1105 for (let i = 0z; i < len(TEST_ATANHSC); i += 1) { 1106 const v = TEST_ATANHSC[i]; 1107 if (math::isnan(v.0.1) || math::isnan(v.1.1)) { 1108 // Negating NaN is undefined with regard to the sign bit 1109 // produced. 1110 continue; 1111 }; 1112 assert(calike(v.1, atanhc128(v.0))); 1113 // atanh(conj(z)) == conj(atanh(z)) 1114 assert(calike(conjc128(v.1), atanhc128(conjc128(v.0))) 1115 || calike(v.0, conjc128(v.0))); 1116 if (math::isnan(v.0.0) || math::isnan(v.1.0)) { 1117 // Negating NaN is undefined with regard to the sign bit 1118 // produced. 1119 continue; 1120 }; 1121 // atanh(-z) == -atanh(z) 1122 assert(calike((-v.1.0, -v.1.1), atanhc128((-v.0.0, -v.0.1))) 1123 || calike(v.0, (-v.0.0, -v.0.1))); 1124 }; 1125 for (let i = 0z; i < len(BRANCHPOINTS); i += 1) { 1126 const pt = BRANCHPOINTS[i]; 1127 assert(cveryclose(atanhc128(pt.0), atanhc128(pt.1))); 1128 }; 1129 }; 1130 1131 @test fn conj() void = { 1132 for (let i = 0z; i < len(VC); i += 1) { 1133 assert(cveryclose(TEST_CONJ[i], conjc128(VC[i]))); 1134 }; 1135 for (let i = 0z; i < len(TEST_VCCONJSC); i += 1) { 1136 assert(calike(TEST_CONJSC[i], conjc128(TEST_VCCONJSC[i]))); 1137 }; 1138 }; 1139 1140 @test fn cos() void = { 1141 for (let i = 0z; i < len(VC); i += 1) { 1142 assert(csoclose(TEST_COS[i], cosc128(VC[i]), 3e-15)); 1143 }; 1144 for (let i = 0z; i < len(TEST_COSSC); i += 1) { 1145 const v = TEST_COSSC[i]; 1146 if (isnan(v.0) || math::isnan(v.1.1)) { 1147 // Negating NaN is undefined with regard to the sign bit 1148 // produced. 1149 continue; 1150 }; 1151 assert(calike(v.1, cosc128(v.0))); 1152 // cos(conj(z)) == cos(cosh(z)) 1153 assert (calike(conjc128(v.1), cosc128(conjc128(v.0))) 1154 || calike(v.0, conjc128(v.0))); 1155 if (math::isnan(v.0.0) || math::isnan(v.1.0)) { 1156 // Negating NaN is undefined with regard to the sign bit 1157 // produced. 1158 continue; 1159 }; 1160 // cos(-z) == cos(z) 1161 assert(calike(v.1, cosc128((-v.0.0, -v.0.1))) 1162 || calike(v.0, (-v.0.0, -v.0.1))); 1163 }; 1164 }; 1165 1166 @test fn cosh() void = { 1167 for (let i = 0z; i < len(VC); i += 1) { 1168 assert(csoclose(TEST_COSH[i], coshc128(VC[i]), 2e-15)); 1169 }; 1170 for (let i = 0z; i < len(TEST_COSHSC); i += 1) { 1171 const v = TEST_COSHSC[i]; 1172 if (math::isnan(v.0.1) || math::isnan(v.1.1)) { 1173 // Negating NaN is undefined with regard to the sign bit 1174 // produced. 1175 continue; 1176 }; 1177 assert(calike(v.1, coshc128(v.0))); 1178 // cosh(conj(z)) == conj(cosh(z)) 1179 assert(calike(conjc128(v.1), coshc128(conjc128(v.0))) 1180 || calike(v.0, conjc128(v.0))); 1181 if (math::isnan(v.0.0) || math::isnan(v.1.0)) { 1182 // Negating NaN is undefined with regard to the sign bit 1183 // produced. 1184 continue; 1185 }; 1186 // cosh(-z) == cosh(z) 1187 assert(calike(v.1, coshc128((-v.0.0, -v.0.1))) 1188 || calike(v.0, (-v.0.0, -v.0.1))); 1189 }; 1190 }; 1191 1192 @test fn exp() void = { 1193 for (let i = 0z; i < len(VC); i += 1) { 1194 assert(csoclose(TEST_EXP[i], expc128(VC[i]), 1e-15)); 1195 }; 1196 for (let i = 0z; i < len(TEST_EXPSC); i += 1) { 1197 const v = TEST_EXPSC[i]; 1198 if (math::isnan(v.0.1) || math::isnan(v.1.1)) { 1199 // Negating NaN is undefined with regard to the sign bit 1200 // produced. 1201 continue; 1202 }; 1203 assert(calike(v.1, expc128(v.0))); 1204 // exp(conj(z)) == exp(cosh(z)) 1205 assert(calike(conjc128(v.1), expc128(conjc128(v.0))) 1206 || calike(v.0, conjc128(v.0))); 1207 }; 1208 }; 1209 1210 @test fn isnan() void = { 1211 for (let i = 0z; i < len(TEST_VCISNANSC); i += 1) { 1212 assert(TEST_ISNANSC[i] == isnan(TEST_VCISNANSC[i])); 1213 }; 1214 }; 1215 1216 @test fn log() void = { 1217 for (let i = 0z; i < len(VC); i += 1) { 1218 assert(cveryclose(TEST_LOG[i], logc128(VC[i]))); 1219 }; 1220 for (let i = 0z; i < len(TEST_LOGSC); i += 1) { 1221 const v = TEST_LOGSC[i]; 1222 assert(calike(v.1, logc128(v.0))); 1223 if (math::isnan(v.0.1) || math::isnan(v.1.1)) { 1224 // Negating NaN is undefined with regard to the sign bit 1225 // produced. 1226 continue; 1227 }; 1228 // log(conj(z)) == conj(log(z)) 1229 assert(calike(conjc128(v.1), logc128(conjc128(v.0))) 1230 || calike(v.0, conjc128(v.0))); 1231 }; 1232 for (let i = 0z; i < len(BRANCHPOINTS); i += 1) { 1233 const pt = BRANCHPOINTS[i]; 1234 assert(cveryclose(logc128(pt.0), logc128(pt.1))); 1235 }; 1236 }; 1237 1238 @test fn polar() void = { 1239 for (let i = 0z; i < len(VC); i += 1) { 1240 const p = polarc128(VC[i]); 1241 assert(veryclose(TEST_POLAR[i].0, p.0) 1242 || veryclose(TEST_POLAR[i].1, p.1)); 1243 }; 1244 for (let i = 0z; i < len(TEST_VCPOLARSC); i += 1) { 1245 const p = polarc128(TEST_VCPOLARSC[i]); 1246 assert(alike(TEST_POLARSC[i].0, p.0) 1247 || alike(TEST_POLARSC[i].1, p.1)); 1248 }; 1249 }; 1250 1251 @test fn pow() void = { 1252 // Special cases for pow(0, c). 1253 const zeropowers: [](c128, c128) = [ 1254 ((0f64, 0f64), (1f64, 0f64)), 1255 ((1.5, 0f64), (0f64, 0f64)), 1256 ((-1.5, 0f64), (math::INF, 0f64)), 1257 ((-1.5, 1.5), (math::INF, math::INF)), 1258 ]; 1259 for (let i = 0z; i < len(zeropowers); i += 1) { 1260 const zp = zeropowers[i]; 1261 assert(equalc128(powc128((0f64, 0f64), zp.0), zp.1)); 1262 }; 1263 const a = (3f64, 3f64); 1264 for (let i = 0z; i < len(VC); i += 1) { 1265 assert(csoclose(TEST_POW[i], powc128(a, VC[i]), 4e-15)); 1266 }; 1267 for (let i = 0z; i < len(TEST_VCPOWSC); i += 1) { 1268 const f = TEST_VCPOWSC[i]; 1269 assert(calike(TEST_POWSC[i], powc128(f.0, f.1))); 1270 }; 1271 for (let i = 0z; i < len(BRANCHPOINTS); i += 1) { 1272 const pt = BRANCHPOINTS[i]; 1273 assert(cveryclose(powc128(pt.0, (0.1, 0f64)), 1274 powc128(pt.1, (0.1, 0f64)))); 1275 }; 1276 }; 1277 1278 @test fn rect() void = { 1279 for (let i = 0z; i < len(VC); i += 1) { 1280 const f = TEST_POLAR[i]; 1281 assert(cveryclose(VC[i], rectc128(f.0, f.1))); 1282 }; 1283 for (let i = 0z; i < len(TEST_VCPOLARSC); i += 1) { 1284 const f = TEST_POLARSC[i]; 1285 assert(calike(TEST_VCPOLARSC[i], rectc128(f.0, f.1))); 1286 }; 1287 }; 1288 1289 @test fn sin() void = { 1290 for (let i = 0z; i < len(VC); i += 1) { 1291 assert(csoclose(TEST_SIN[i], sinc128(VC[i]), 2e-15)); 1292 }; 1293 for (let i = 0z; i < len(TEST_SINSC); i += 1) { 1294 const v = TEST_SINSC[i]; 1295 assert(calike(v.1, sinc128(v.0))); 1296 if (math::isnan(v.0.1) || math::isnan(v.1.1)) { 1297 // Negating NaN is undefined with regard to the sign bit 1298 // produced. 1299 continue; 1300 }; 1301 // sin(conj(z)) == conj(sin(z)) 1302 assert(calike(conjc128(sinc128(v.0)), sinc128(conjc128(v.0))) 1303 || calike(v.0, conjc128(v.0))); 1304 if (math::isnan(v.0.0) || math::isnan(v.1.0)) { 1305 // Negating NaN is undefined with regard to the sign bit 1306 // produced. 1307 continue; 1308 }; 1309 // sin(-z) == -sin(z) 1310 assert(calike((-v.1.0, -v.1.1), sinc128((-v.0.0, -v.0.1))) 1311 || calike(v.0, (-v.0.0, -v.0.1))); 1312 }; 1313 }; 1314 1315 @test fn sinh() void = { 1316 for (let i = 0z; i < len(VC); i += 1) { 1317 assert(csoclose(TEST_SINH[i], sinhc128(VC[i]), 2e-15)); 1318 }; 1319 for (let i = 0z; i < len(TEST_SINHSC); i += 1) { 1320 const v = TEST_SINHSC[i]; 1321 assert(calike(v.1, sinhc128(v.0))); 1322 if (math::isnan(v.0.1) || math::isnan(v.1.1)) { 1323 // Negating NaN is undefined with regard to the sign bit 1324 // produced. 1325 continue; 1326 }; 1327 // sinh(conj(z)) == conj(sinh(z)) 1328 assert(calike(conjc128(v.1), sinhc128(conjc128(v.0))) 1329 || calike(v.0, conjc128(v.0))); 1330 if (math::isnan(v.0.0) || math::isnan(v.1.0)) { 1331 // Negating NaN is undefined with regard to the sign bit 1332 // produced. 1333 continue; 1334 }; 1335 // sinh(-z) == -sinh(z) 1336 assert(calike((-v.1.0, -v.1.1), sinhc128((-v.0.0, -v.0.1))) 1337 || calike(v.0, (-v.0.0, -v.0.1))); 1338 }; 1339 }; 1340 1341 @test fn sqrt() void = { 1342 for (let i = 0z; i < len(VC); i += 1) { 1343 assert(cveryclose(TEST_SQRT[i], sqrtc128(VC[i]))); 1344 }; 1345 for (let i = 0z; i < len(TEST_SQRTSC); i += 1) { 1346 const v = TEST_SQRTSC[i]; 1347 assert(calike(v.1, sqrtc128(v.0))); 1348 if (math::isnan(v.0.1) || math::isnan(v.1.1)) { 1349 // Negating NaN is undefined with regard to the sign bit 1350 // produced. 1351 continue; 1352 }; 1353 // sqrt(conj(z)) == conj(sqrt(z)) 1354 assert(calike(conjc128(v.1), sqrtc128(conjc128(v.0))) 1355 || calike(v.0, conjc128(v.0))); 1356 }; 1357 for (let i = 0z; i < len(BRANCHPOINTS); i += 1) { 1358 const pt = BRANCHPOINTS[i]; 1359 assert(cveryclose(sqrtc128(pt.0), sqrtc128(pt.1))); 1360 }; 1361 }; 1362 1363 @test fn tan() void = { 1364 for (let i = 0z; i < len(VC); i += 1) { 1365 assert(csoclose(TEST_TAN[i], tanc128(VC[i]), 3e-15)); 1366 }; 1367 for (let i = 0z; i < len(TEST_TANSC); i += 1) { 1368 const v = TEST_TANSC[i]; 1369 if (math::isnan(v.0.1) || math::isnan(v.1.1)) { 1370 // Negating NaN is undefined with regard to the sign bit 1371 // produced. 1372 continue; 1373 }; 1374 if (math::isnan(v.0.0) && math::isinf(v.0.1)) { 1375 const r = tanc128(v.0); 1376 assert(r.0 == v.1.0 && r.1 == v.1.1); 1377 continue; 1378 }; 1379 assert(calike(v.1, tanc128(v.0))); 1380 // tan(conj(z)) == conj(tan(z)) 1381 assert (calike(conjc128(v.1), tanc128(conjc128(v.0))) 1382 || calike(v.0, conjc128(v.0))); 1383 if (math::isnan(v.0.0) || math::isnan(v.1.0)) { 1384 // Negating NaN is undefined with regard to the sign bit 1385 // produced. 1386 continue; 1387 }; 1388 // tan(-z) == -tan(z) 1389 assert(calike((-v.1.0, -v.1.1), tanc128((-v.0.0, -v.0.1))) 1390 || calike(v.0, (-v.0.0, -v.0.1))); 1391 }; 1392 }; 1393 1394 @test fn tanh() void = { 1395 for (let i = 0z; i < len(VC); i += 1) { 1396 assert(csoclose(TEST_TANH[i], tanhc128(VC[i]), 2e-15)); 1397 }; 1398 for (let i = 0z; i < len(TEST_TANHSC); i += 1) { 1399 const v = TEST_TANHSC[i]; 1400 if (math::isnan(v.0.1) || math::isnan(v.1.1)) { 1401 // Negating NaN is undefined with regard to the sign bit 1402 // produced. 1403 continue; 1404 }; 1405 assert(calike(v.1, tanhc128(v.0))); 1406 // tanh(conj(z)) == conj(tanh(z)) 1407 assert(calike(conjc128(v.1), tanhc128(conjc128(v.0))) 1408 || calike(v.0, conjc128(v.0))); 1409 if (math::isnan(v.0.0) || math::isnan(v.1.0)) { 1410 // Negating NaN is undefined with regard to the sign bit 1411 // produced. 1412 continue; 1413 }; 1414 // tanh(-z) == -tanh(z) 1415 assert(calike((-v.1.0, -v.1.1), tanhc128((-v.0.0, -v.0.1))) 1416 || calike(v.0, (-v.0.0, -v.0.1))); 1417 }; 1418 }; 1419 1420 @test fn tanhuge() void = { 1421 for (let i = 0z; i < len(TEST_HUGEIN); i += 1) { 1422 assert(csoclose(TEST_TANHUGE[i], tanc128(TEST_HUGEIN[i]), 1e-15)); 1423 }; 1424 };