hare

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

trig_test.ha (5804B)


      1 // SPDX-License-Identifier: MPL-2.0
      2 // (c) Hare authors <https://harelang.org>
      3 
      4 @test fn trig_reduce() void = {
      5 	for (let idx = 0z; idx < 10; idx += 1) {
      6 		const reduced = trig_reduce(TEST_INPUTS[idx]);
      7 		const j = reduced.0;
      8 		const z = reduced.1;
      9 		const xred = (j: i64: f64) * (PI / 4f64) + z;
     10 		assert(isclose(
     11 			sinf64(TEST_INPUTS[idx]),
     12 			sinf64(xred)));
     13 	};
     14 };
     15 
     16 @test fn cos() void = {
     17 	for (let idx = 0z; idx < 10; idx += 1) {
     18 		assert(isclose(
     19 			cosf64(TEST_INPUTS[idx]), TEST_COS[idx]));
     20 	};
     21 	assert(isnan(cosf64(-INF)));
     22 	assert(isnan(cosf64(INF)));
     23 	assert(isnan(cosf64(NAN)));
     24 };
     25 
     26 @test fn sin() void = {
     27 	for (let idx = 0z; idx < 10; idx += 1) {
     28 		assert(isclose(
     29 			sinf64(TEST_INPUTS[idx]), TEST_SIN[idx]));
     30 	};
     31 	assert(isnan(sinf64(-INF)));
     32 	assert(sinf64(-0f64) == -0f64);
     33 	assert(sinf64(0f64) == 0f64);
     34 	assert(isnan(sinf64(INF)));
     35 	assert(isnan(sinf64(NAN)));
     36 };
     37 
     38 @test fn tan() void = {
     39 	for (let idx = 0z; idx < 10; idx += 1) {
     40 		assert(isclose(
     41 			tanf64(TEST_INPUTS[idx]), TEST_TAN[idx]));
     42 	};
     43 	assert(isnan(sinf64(-INF)));
     44 	assert(sinf64(-0f64) == -0f64);
     45 	assert(sinf64(0f64) == 0f64);
     46 	assert(isnan(sinf64(INF)));
     47 	assert(isnan(sinf64(NAN)));
     48 };
     49 
     50 @test fn asin() void = {
     51 	for (let idx = 0z; idx < 10; idx += 1) {
     52 		assert(isclose(
     53 			asinf64(TEST_INPUTS[idx] / 10f64),
     54 			TEST_ASIN[idx]));
     55 	};
     56 	assert(isnan(asinf64(-PI)));
     57 	assert(asinf64(-0f64) == -0f64);
     58 	assert(asinf64(0f64) == 0f64);
     59 	assert(isnan(asinf64(PI)));
     60 	assert(isnan(asinf64(NAN)));
     61 };
     62 
     63 @test fn acos() void = {
     64 	for (let idx = 0z; idx < 10; idx += 1) {
     65 		assert(isclose(
     66 			acosf64(TEST_INPUTS[idx] / 10f64),
     67 			TEST_ACOS[idx]));
     68 	};
     69 	assert(isnan(acosf64(-PI)));
     70 	assert(acosf64(1f64) == 0f64);
     71 	assert(isnan(acosf64(PI)));
     72 	assert(isnan(acosf64(NAN)));
     73 };
     74 
     75 @test fn atan() void = {
     76 	for (let idx = 0z; idx < 10; idx += 1) {
     77 		assert(isclose(
     78 			atanf64(TEST_INPUTS[idx]),
     79 			TEST_ATAN[idx]));
     80 	};
     81 	assert(atanf64(-INF) == -PI / 2f64);
     82 	assert(atanf64(-0f64) == -0f64);
     83 	assert(atanf64(0f64) == 0f64);
     84 	assert(atanf64(INF) == PI / 2f64);
     85 	assert(isnan(atanf64(NAN)));
     86 };
     87 
     88 @test fn sinh() void = {
     89 	for (let idx = 0z; idx < 10; idx += 1) {
     90 		assert(eqwithin(
     91 			sinhf64(TEST_INPUTS[idx]),
     92 			TEST_SINH[idx],
     93 			1e-6f64));
     94 	};
     95 	assert(sinhf64(-INF) == -INF);
     96 	assert(sinhf64(-0f64) == -0f64);
     97 	assert(sinhf64(0f64) == 0f64);
     98 	assert(sinhf64(INF) == INF);
     99 	assert(isnan(sinhf64(NAN)));
    100 };
    101 
    102 @test fn cosh() void = {
    103 	for (let idx = 0z; idx < 10; idx += 1) {
    104 		assert(isclose(
    105 			coshf64(TEST_INPUTS[idx]),
    106 			TEST_COSH[idx]));
    107 	};
    108 	assert(coshf64(-INF) == INF);
    109 	assert(coshf64(-0f64) == 1f64);
    110 	assert(coshf64(0f64) == 1f64);
    111 	assert(coshf64(INF) == INF);
    112 	assert(isnan(coshf64(NAN)));
    113 };
    114 
    115 @test fn tanh() void = {
    116 	for (let idx = 0z; idx < 10; idx += 1) {
    117 		assert(isclose(
    118 			tanhf64(TEST_INPUTS[idx]),
    119 			TEST_TANH[idx]));
    120 	};
    121 	assert(tanhf64(-INF) == -1f64);
    122 	assert(tanhf64(-0f64) == -0f64);
    123 	assert(tanhf64(0f64) == 0f64);
    124 	assert(tanhf64(INF) == 1f64);
    125 	assert(isnan(tanhf64(NAN)));
    126 };
    127 
    128 @test fn asinh() void = {
    129 	for (let idx = 0z; idx < 10; idx += 1) {
    130 		assert(isclose(
    131 			asinhf64(TEST_INPUTS[idx]),
    132 			TEST_ASINH[idx]));
    133 	};
    134 	assert(asinhf64(-INF) == -INF);
    135 	assert(asinhf64(-0f64) == -0f64);
    136 	assert(asinhf64(0f64) == 0f64);
    137 	assert(asinhf64(INF) == INF);
    138 	assert(isnan(asinhf64(NAN)));
    139 };
    140 
    141 @test fn acosh() void = {
    142 	for (let idx = 0z; idx < 10; idx += 1) {
    143 		assert(isclose(
    144 			acoshf64(1f64 + absf64(TEST_INPUTS[idx])),
    145 			TEST_ACOSH[idx]));
    146 	};
    147 	assert(isnan(acoshf64(-INF)));
    148 	assert(isnan(acoshf64(0.5f64)));
    149 	assert(acoshf64(1f64) == 0f64);
    150 	assert(acoshf64(INF) == INF);
    151 	assert(isnan(acoshf64(NAN)));
    152 };
    153 
    154 @test fn atanh() void = {
    155 	for (let idx = 0z; idx < 10; idx += 1) {
    156 		assert(isclose(
    157 			atanhf64(TEST_INPUTS[idx] / 10f64),
    158 			TEST_ATANH[idx]));
    159 	};
    160 	assert(isnan(atanhf64(-INF)));
    161 	assert(isnan(atanhf64(-PI)));
    162 	assert(atanhf64(-1f64) == -INF);
    163 	assert(atanhf64(-0f64) == -0f64);
    164 	assert(atanhf64(0f64) == 0f64);
    165 	assert(atanhf64(1f64) == INF);
    166 	assert(isnan(atanhf64(PI)));
    167 	assert(isnan(atanhf64(INF)));
    168 	assert(isnan(atanhf64(NAN)));
    169 };
    170 
    171 @test fn atan2() void = {
    172 	for (let idx = 0z; idx < 10; idx += 1) {
    173 		assert(isclose(
    174 			atan2f64(10f64, TEST_INPUTS[idx]),
    175 			TEST_ATAN2[idx]));
    176 	};
    177 	assert(isnan(atan2f64(-INF, NAN)));
    178 	assert(atan2f64(-PI, INF) == -0f64);
    179 	assert(isnan(atan2f64(-PI, NAN)));
    180 	assert(atan2f64(-0f64, 0f64) == -0f64);
    181 	assert(atan2f64(-0f64, PI) == -0f64);
    182 	assert(atan2f64(-0f64, INF) == -0f64);
    183 	assert(isnan(atan2f64(-0f64, NAN)));
    184 	assert(atan2f64(0f64, 0f64) == 0f64);
    185 	assert(atan2f64(0f64, PI) == 0f64);
    186 	assert(atan2f64(0f64, INF) == 0f64);
    187 	assert(isnan(atan2f64(0f64, NAN)));
    188 	assert(atan2f64(PI, INF) == 0f64);
    189 	assert(atan2f64(1f64, INF) == 0f64);
    190 	assert(atan2f64(-1f64, INF) == -0f64);
    191 	assert(isnan(atan2f64(PI, NAN)));
    192 	assert(isnan(atan2f64(INF, NAN)));
    193 	assert(isnan(atan2f64(NAN, NAN)));
    194 };
    195 
    196 @test fn hypot() void = {
    197 	for (let idx = 0z; idx < 10; idx += 1) {
    198 		const a = absf64(1e200f64 * TEST_TANH[idx] * SQRT_2);
    199 		assert(isclose(
    200 			hypotf64(1e200f64 * TEST_TANH[idx],
    201 				1e200f64 * TEST_TANH[idx]),
    202 			a));
    203 	};
    204 	assert(hypotf64(-INF, -INF) == INF);
    205 	assert(hypotf64(-INF, 0f64) == INF);
    206 	assert(hypotf64(-INF, INF) == INF);
    207 	assert(hypotf64(-INF, NAN) == INF);
    208 	assert(hypotf64(-0f64, -0f64) == 0f64);
    209 	assert(hypotf64(-0f64, 0f64) == 0f64);
    210 	assert(hypotf64(0f64, -0f64) == 0f64);
    211 	assert(hypotf64(0f64, 0f64) == 0f64);
    212 	assert(hypotf64(0f64, -INF) == INF);
    213 	assert(hypotf64(0f64, INF) == INF);
    214 	assert(isnan(hypotf64(0f64, NAN)));
    215 	assert(hypotf64(INF, -INF) == INF);
    216 	assert(hypotf64(INF, 0f64) == INF);
    217 	assert(hypotf64(INF, INF) == INF);
    218 	assert(hypotf64(INF, NAN) == INF);
    219 	assert(hypotf64(NAN, -INF) == INF);
    220 	assert(isnan(hypotf64(NAN, 0f64)));
    221 	assert(hypotf64(NAN, INF) == INF);
    222 	assert(isnan(hypotf64(NAN, NAN)));
    223 };