56ac5b769c9bdeaea2cfc390938b4a1bf8856950
[opus.git] / libcelt / tests / mathops-test.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #include "mathops.c"
6 #include "entcode.c"
7 #include <stdio.h>
8 #include <math.h>
9
10 #ifdef FIXED_POINT
11 #define WORD "%d"
12 #else
13 #define WORD "%f"
14 #endif
15
16 #ifdef FIXED_DEBUG
17 long long celt_mips=0;
18 #endif
19 int ret = 0;
20
21 void testdiv(void)
22 {
23    opus_int32 i;
24    for (i=1;i<=327670;i++)
25    {
26       double prod;
27       opus_val32 val;
28       val = celt_rcp(i);
29 #ifdef FIXED_POINT
30       prod = (1./32768./65526.)*val*i;
31 #else
32       prod = val*i;
33 #endif
34       if (fabs(prod-1) > .00025)
35       {
36          fprintf (stderr, "div failed: 1/%d="WORD" (product = %f)\n", i, val, prod);
37          ret = 1;
38       }
39    }
40 }
41
42 void testsqrt(void)
43 {
44    opus_int32 i;
45    for (i=1;i<=1000000000;i++)
46    {
47       double ratio;
48       opus_val16 val;
49       val = celt_sqrt(i);
50       ratio = val/sqrt(i);
51       if (fabs(ratio - 1) > .0005 && fabs(val-sqrt(i)) > 2)
52       {
53          fprintf (stderr, "sqrt failed: sqrt(%d)="WORD" (ratio = %f)\n", i, val, ratio);
54          ret = 1;
55       }
56       i+= i>>10;
57    }
58 }
59
60 #ifndef FIXED_POINT
61 void testlog2(void)
62 {
63    float x;
64    for (x=0.001;x<1677700.0;x+=(x/8.0))
65    {
66       float error = fabs((1.442695040888963387*log(x))-celt_log2(x));
67       if (error>0.0009)
68       {
69          fprintf (stderr, "celt_log2 failed: fabs((1.442695040888963387*log(x))-celt_log2(x))>0.001 (x = %f, error = %f)\n", x,error);
70          ret = 1;
71       }
72    }
73 }
74
75 void testexp2(void)
76 {
77    float x;
78    for (x=-11.0;x<24.0;x+=0.0007)
79    {
80       float error = fabs(x-(1.442695040888963387*log(celt_exp2(x))));
81       if (error>0.0002)
82       {
83          fprintf (stderr, "celt_exp2 failed: fabs(x-(1.442695040888963387*log(celt_exp2(x))))>0.0005 (x = %f, error = %f)\n", x,error);
84          ret = 1;
85       }
86    }
87 }
88
89 void testexp2log2(void)
90 {
91    float x;
92    for (x=-11.0;x<24.0;x+=0.0007)
93    {
94       float error = fabs(x-(celt_log2(celt_exp2(x))));
95       if (error>0.001)
96       {
97          fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_log2(celt_exp2(x))))>0.001 (x = %f, error = %f)\n", x,error);
98          ret = 1;
99       }
100    }
101 }
102 #else
103 void testlog2(void)
104 {
105    opus_val32 x;
106    for (x=8;x<1073741824;x+=(x>>3))
107    {
108       float error = fabs((1.442695040888963387*log(x/16384.0))-celt_log2(x)/1024.0);
109       if (error>0.003)
110       {
111          fprintf (stderr, "celt_log2 failed: x = %ld, error = %f\n", (long)x,error);
112          ret = 1;
113       }
114    }
115 }
116
117 void testexp2(void)
118 {
119    opus_val16 x;
120    for (x=-32768;x<15360;x++)
121    {
122       float error1 = fabs(x/1024.0-(1.442695040888963387*log(celt_exp2(x)/65536.0)));
123       float error2 = fabs(exp(0.6931471805599453094*x/1024.0)-celt_exp2(x)/65536.0);
124       if (error1>0.0002&&error2>0.00004)
125       {
126          fprintf (stderr, "celt_exp2 failed: x = "WORD", error1 = %f, error2 = %f\n", x,error1,error2);
127          ret = 1;
128       }
129    }
130 }
131
132 void testexp2log2(void)
133 {
134    opus_val32 x;
135    for (x=8;x<65536;x+=(x>>3))
136    {
137       float error = fabs(x-0.25*celt_exp2(celt_log2(x)))/16384;
138       if (error>0.004)
139       {
140          fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_exp2(celt_log2(x))))>0.001 (x = %ld, error = %f)\n", (long)x,error);
141          ret = 1;
142       }
143    }
144 }
145
146 void testilog2(void)
147 {
148    opus_val32 x;
149    for (x=1;x<=268435455;x+=127)
150    {
151       opus_val32 error = abs(celt_ilog2(x)-(int)floor(log2(x)));
152       if (error!=0)
153       {
154          printf("celt_ilog2 failed: celt_ilog2(x)!=floor(log2(x)) (x = %d, error = %d)\n",x,error);
155          ret = 1;
156       }
157    }
158 }
159 #endif
160
161 int main(void)
162 {
163    testdiv();
164    testsqrt();
165    testlog2();
166    testexp2();
167    testexp2log2();
168 #ifdef FIXED_POINT
169    testilog2();
170 #endif
171    return ret;
172 }