blob: cb3c1325a11a9e6c8fc9d5423b4cdcae3384ffd7 [file] [log] [blame]
Jean-Marc Valin92518982008-03-13 17:20:08 +11001#ifdef HAVE_CONFIG_H
2#include "config.h"
3#endif
4
5#include "mathops.h"
6#include <stdio.h>
7#include <math.h>
8
9#ifdef FIXED_POINT
10#define WORD "%d"
11#else
12#define WORD "%f"
13#endif
14
15int ret = 0;
16
Jean-Marc Valina82dfdd2008-03-13 23:01:55 +110017void testdiv(void)
Jean-Marc Valin92518982008-03-13 17:20:08 +110018{
19 celt_int32_t i;
Jean-Marc Valin385795e2008-03-26 15:56:07 +110020 for (i=1;i<=327670;i++)
Jean-Marc Valin92518982008-03-13 17:20:08 +110021 {
22 double prod;
23 celt_word32_t val;
Jean-Marc Valin92518982008-03-13 17:20:08 +110024 val = celt_rcp(i);
25#ifdef FIXED_POINT
26 prod = (1./32768./65526.)*val*i;
27#else
28 prod = val*i;
29#endif
30 if (fabs(prod-1) > .001)
31 {
32 fprintf (stderr, "div failed: 1/%d="WORD" (product = %f)\n", i, val, prod);
33 ret = 1;
34 }
35 }
36}
37
Jean-Marc Valina82dfdd2008-03-13 23:01:55 +110038void testsqrt(void)
Jean-Marc Valin92518982008-03-13 17:20:08 +110039{
40 celt_int32_t i;
41 for (i=1;i<=1000000000;i++)
42 {
43 double ratio;
44 celt_word16_t val;
45 val = celt_sqrt(i);
46 ratio = val/sqrt(i);
47 if (fabs(ratio - 1) > .001 && fabs(val-sqrt(i)) > 2)
48 {
49 fprintf (stderr, "sqrt failed: sqrt(%d)="WORD" (ratio = %f)\n", i, val, ratio);
50 ret = 1;
51 }
52 i+= i>>10;
53 }
54}
55
Jean-Marc Valin189acec2008-03-26 16:42:42 +110056void testrsqrt(void)
57{
58 celt_int32_t i;
59 for (i=1;i<=2000000;i++)
60 {
61 double ratio;
62 celt_word16_t val;
63 val = celt_rsqrt(i);
Jean-Marc Valin5a7d9b22008-04-05 14:36:05 +100064 ratio = val*sqrt(i)/Q15ONE;
Jean-Marc Valin189acec2008-03-26 16:42:42 +110065 if (fabs(ratio - 1) > .05)
66 {
Jean-Marc Valin5a7d9b22008-04-05 14:36:05 +100067 fprintf (stderr, "rsqrt failed: rsqrt(%d)="WORD" (ratio = %f)\n", i, val, ratio);
Jean-Marc Valin189acec2008-03-26 16:42:42 +110068 ret = 1;
69 }
70 i+= i>>10;
71 }
72}
73
Gregory Maxwellb92dce32009-06-28 19:51:30 -040074#ifndef FIXED_POINT
75void testlog2(void)
76{
77 float x;
78 for (x=0.001;x<1677700.0;x+=(x/8.0))
79 {
80 float error = fabs((1.442695040888963387*log(x))-celt_log2(x));
81 if (error>0.001)
82 {
83 fprintf (stderr, "celt_log2 failed: fabs((1.442695040888963387*log(x))-celt_log2(x))>0.001 (x = %f, error = %f)\n", x,error);
84 ret = 1;
85 }
86 }
87}
88
89void testexp2(void)
90{
91 float x;
92 for (x=-11.0;x<24.0;x+=0.0007)
93 {
94 float error = fabs(x-(1.442695040888963387*log(celt_exp2(x))));
95 if (error>0.0005)
96 {
97 fprintf (stderr, "celt_exp2 failed: fabs(x-(1.442695040888963387*log(celt_exp2(x))))>0.0005 (x = %f, error = %f)\n", x,error);
98 ret = 1;
99 }
100 }
101}
102
103void testexp2log2(void)
104{
105 float x;
106 for (x=-11.0;x<24.0;x+=0.0007)
107 {
108 float error = fabs(x-(celt_log2(celt_exp2(x))));
109 if (error>0.001)
110 {
111 fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_log2(celt_exp2(x))))>0.001 (x = %f, error = %f)\n", x,error);
112 ret = 1;
113 }
114 }
115}
116#else
117void testilog2(void)
118{
119 celt_word32_t x;
120 for (x=1;x<=268435455;x+=127)
121 {
122 celt_word32_t error = abs(celt_ilog2(x)-(int)floor(log2(x)));
123 if (error!=0)
124 {
125 printf("celt_ilog2 failed: celt_ilog2(x)!=floor(log2(x)) (x = %d, error = %d)\n",x,error);
126 ret = 1;
127 }
128 }
129}
130#endif
131
Jean-Marc Valina82dfdd2008-03-13 23:01:55 +1100132int main(void)
Jean-Marc Valin92518982008-03-13 17:20:08 +1100133{
134 testdiv();
135 testsqrt();
Jean-Marc Valin189acec2008-03-26 16:42:42 +1100136 testrsqrt();
Gregory Maxwellb92dce32009-06-28 19:51:30 -0400137#ifndef FIXED_POINT
138 testlog2();
139 testexp2();
140 testexp2log2();
141#else
142 testilog2();
143#endif
Jean-Marc Valin385795e2008-03-26 15:56:07 +1100144 return ret;
Jean-Marc Valin92518982008-03-13 17:20:08 +1100145}