rsys

Basic data structures and low-level features
git clone git://git.meso-star.fr/rsys.git
Log | Files | Refs | README | LICENSE

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 }