hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

+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 };