test_math.c (3690B)
1 /* Copyright (C) 2013-2023, 2025 Vincent Forest (vaplv@free.fr) 2 * 3 * The RSys library is free software: you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published 5 * by the Free Software Foundation, either version 3 of the License, or 6 * (at your option) any later version. 7 * 8 * The RSys library is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with the RSys library. If not, see <http://www.gnu.org/licenses/>. */ 15 16 #include "math.h" 17 18 #ifdef COMPILER_CL 19 #pragma warning(disable:4127) /* Constant conditional expression */ 20 #pragma warning(disable:4723) /* Division by zero */ 21 #endif 22 23 int 24 main(int argc, char** argv) 25 { 26 double d; 27 float f, g; 28 int i; 29 (void)argc, (void)argv; 30 31 f = -3.14159f; CHK(absf(f) == -f); 32 f = 3.14159f; CHK(absf(f) == f); 33 f = -3.14159f; g = 2.71828f; 34 CHK(MMAX(f, g) == g); 35 CHK(MMIN(f, g) == f); 36 CHK(MMAX(-10, 0) == 0); 37 CHK(MMAX(10, 0) == 10); 38 CHK(MMIN(-10, 0) == -10); 39 CHK(MMIN(10, 0) == 0); 40 41 CHK(CLAMP(0.1f, 0.f, 1.f) == 0.1f); 42 CHK(CLAMP(-0.1f, 0.f, 1.f) == 0.f); 43 CHK(CLAMP(1.2f, 0.f, 1.f) == 1.f); 44 CHK(CLAMP(1.f, 0.f, 1.f) == 1.f); 45 CHK(CLAMP(0, -127, 127) == 0); 46 CHK(CLAMP(255, -127, 127) == 127); 47 CHK(CLAMP(-255, -127, 127) == -127); 48 49 CHK(eq_epsf((float)PI, 3.14159265358979323846f, 1.e-6f) == 1); 50 CHK(eq_epsf((float)RCP_PI, 1.f / (float)PI, 1.e-6f) == 1); 51 CHK(eq_eps(PI, 3.14159265358979323846, 1.e-8) == 1); 52 CHK(eq_eps(RCP_PI, 1.0/PI, 1.e-8) == 1); 53 54 CHK(1.f/0.f == (float)INF); 55 CHK(-1.f/0.f == (float)-INF); 56 CHK(1.0/0.0 != -INF); 57 CHK(1.0/0.0 == INF); 58 CHK(-1.0/0.0 != INF); 59 CHK(-1.0/0.0 == -INF); 60 CHK(IS_INF(PI/0.0) != 0); 61 CHK(IS_INF(-PI/0.0) != 0); 62 CHK(IS_INF(PI) == 0); 63 64 d = NaN; 65 CHK(d != d); 66 CHK(IS_NaN(d) == 1); 67 d = -NaN; 68 CHK(d!=d); 69 CHK(IS_NaN(d) == 1); 70 d = sqrt(-1); 71 CHK(IS_NaN(d) == 1); 72 f = (float)NaN; 73 CHK(f!=f); 74 CHK(IS_NaN(f) == 1); 75 f = (float)sqrt(-1); 76 CHK(f!=f); 77 CHK(IS_NaN(f) == 1); 78 CHK(IS_NaN(NaN) == 1); 79 CHK(IS_NaN(-NaN) == 1); 80 CHK(IS_NaN(INF) == 0); 81 CHK(IS_NaN(-INF) == 0); 82 CHK(IS_NaN(1.0/3.0) == 0); 83 84 CHK(IS_POW2(0) == 0); 85 CHK(IS_POW2(1) == 1); 86 CHK(IS_POW2(2) == 1); 87 CHK(IS_POW2(3) == 0); 88 CHK(IS_POW2(31) == 0); 89 CHK(IS_POW2(64) == 1); 90 CHK(IS_POW2(1 << 16) == 1); 91 92 CHK(log2i(3) == 1); 93 CHK(log2i(4) == 2); 94 CHK(log2i(5) == 2); 95 CHK(log2i(7) == 2); 96 CHK(log2i(8) == 3); 97 CHK(log2i(12) == 3); 98 CHK(log2i(511) == 8); 99 CHK(log2i(512) == 9); 100 101 CHK(round_up_pow2(0) == 1); 102 CHK(round_up_pow2(3) == 4); 103 CHK(round_up_pow2(4) == 4); 104 CHK(round_up_pow2(100) == 128); 105 106 CHK(absf(-1.f) == 1.f); 107 CHK(absf(10.f) == 10.f); 108 CHK(absf(-3.14159f) == (float)3.14159f); 109 110 CHK(eq_eps(MDEG2RAD(90.0), PI*0.5, 1.e-8) == 1); 111 CHK(eq_eps(MDEG2RAD(45.0), PI*0.25, 1.e-8) == 1); 112 CHK(eq_eps(MRAD2DEG(PI), 180.0, 1.e-8) == 1); 113 CHK(eq_eps(MRAD2DEG(PI*0.75), 135.0, 1.e-8) == 1); 114 CHK(eq_eps(MRAD2DEG(MDEG2RAD(70.0)), 70.0, 1.e-8) == 1); 115 116 FOR_EACH(i, 0, 16) { 117 double c, s, tmp; 118 d = ((float)rand() / (float)RAND_MAX) * PI; 119 c = cos(d); 120 s = sin(d); 121 tmp = cos2sin(c); 122 CHK(eq_eps(s, tmp, 1.0e-8) || eq_eps(s, -tmp, 1.0e-8) == 1); 123 tmp = sin2cos(s); 124 CHK(eq_eps(c, tmp, 1.0e-8) || eq_eps(c, -tmp, 1.0e-8) == 1); 125 } 126 127 CHK(signf(-3.14159f) == -1.f); 128 CHK(signf(1.23f) == 1.f); 129 CHK(signf(0.f) == 1.f); 130 CHK(sign(-3.14159) == -1.0); 131 CHK(sign(1.23) == 1.0); 132 CHK(sign(0.0) == 1.0); 133 134 return 0; 135 }