16b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/* Copyright (c) 2008-2011 Xiph.Org Foundation, Mozilla Corporation,
26b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org                           Gregory Maxwell
36b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   Written by Jean-Marc Valin, Gregory Maxwell, and Timothy B. Terriberry */
46b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/*
56b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   Redistribution and use in source and binary forms, with or without
66b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   modification, are permitted provided that the following conditions
76b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   are met:
86b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org
96b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   - Redistributions of source code must retain the above copyright
106b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   notice, this list of conditions and the following disclaimer.
116b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org
126b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   - Redistributions in binary form must reproduce the above copyright
136b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   notice, this list of conditions and the following disclaimer in the
146b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   documentation and/or other materials provided with the distribution.
156b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org
166b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
206b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
216b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
226b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
236b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
246b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
256b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
266b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org*/
286b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org
29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef HAVE_CONFIG_H
30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "config.h"
31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef CUSTOM_MODES
34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define CUSTOM_MODES
35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define CELT_C
38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "mathops.c"
40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entenc.c"
41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entdec.c"
42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entcode.c"
43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "bands.c"
44e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include "quant_bands.c"
45e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#include "laplace.c"
46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "vq.c"
47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "cwrs.c"
48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <stdio.h>
49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <math.h>
50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef FIXED_POINT
52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define WORD "%d"
53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#else
54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define WORD "%f"
55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgint ret = 0;
58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid testdiv(void)
60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_int32 i;
62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (i=1;i<=327670;i++)
63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      double prod;
65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_val32 val;
66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      val = celt_rcp(i);
67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef FIXED_POINT
68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      prod = (1./32768./65526.)*val*i;
69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#else
70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      prod = val*i;
71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (fabs(prod-1) > .00025)
73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         fprintf (stderr, "div failed: 1/%d="WORD" (product = %f)\n", i, val, prod);
75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         ret = 1;
76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid testsqrt(void)
81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_int32 i;
83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (i=1;i<=1000000000;i++)
84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      double ratio;
86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_val16 val;
87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      val = celt_sqrt(i);
88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      ratio = val/sqrt(i);
89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (fabs(ratio - 1) > .0005 && fabs(val-sqrt(i)) > 2)
90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         fprintf (stderr, "sqrt failed: sqrt(%d)="WORD" (ratio = %f)\n", i, val, ratio);
92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         ret = 1;
93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      i+= i>>10;
95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
97885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
98885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid testbitexactcos(void)
99885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
100885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int i;
101885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_int32 min_d,max_d,last,chk;
102885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   chk=max_d=0;
103885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   last=min_d=32767;
104885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for(i=64;i<=16320;i++)
105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_int32 d;
107885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_int32 q=bitexact_cos(i);
108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      chk ^= q*i;
109885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      d = last - q;
110885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (d>max_d)max_d=d;
111885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (d<min_d)min_d=d;
112885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      last = q;
113885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if ((chk!=89408644)||(max_d!=5)||(min_d!=0)||(bitexact_cos(64)!=32767)||
115885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org       (bitexact_cos(16320)!=200)||(bitexact_cos(8192)!=23171))
116885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
117885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fprintf (stderr, "bitexact_cos failed\n");
118885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      ret = 1;
119885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
120885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
121885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
122885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid testbitexactlog2tan(void)
123885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
124885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int i,fail;
125885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_int32 min_d,max_d,last,chk;
126885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   fail=chk=max_d=0;
127885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   last=min_d=15059;
128885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for(i=64;i<8193;i++)
129885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
130885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_int32 d;
131885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_int32 mid=bitexact_cos(i);
132885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_int32 side=bitexact_cos(16384-i);
133885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_int32 q=bitexact_log2tan(mid,side);
134885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      chk ^= q*i;
135885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      d = last - q;
136885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (q!=-1*bitexact_log2tan(side,mid))
137885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        fail = 1;
138885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (d>max_d)max_d=d;
139885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (d<min_d)min_d=d;
140885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      last = q;
141885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
142885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if ((chk!=15821257)||(max_d!=61)||(min_d!=-2)||fail||
143885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org       (bitexact_log2tan(32767,200)!=15059)||(bitexact_log2tan(30274,12540)!=2611)||
144885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org       (bitexact_log2tan(23171,23171)!=0))
145885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
146885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fprintf (stderr, "bitexact_log2tan failed\n");
147885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      ret = 1;
148885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
149885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
150885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
151885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef FIXED_POINT
152885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid testlog2(void)
153885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
154885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   float x;
155885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (x=0.001;x<1677700.0;x+=(x/8.0))
156885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
157885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      float error = fabs((1.442695040888963387*log(x))-celt_log2(x));
158885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (error>0.0009)
159885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
160885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         fprintf (stderr, "celt_log2 failed: fabs((1.442695040888963387*log(x))-celt_log2(x))>0.001 (x = %f, error = %f)\n", x,error);
161885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         ret = 1;
162885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
163885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
164885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
165885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
166885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid testexp2(void)
167885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
168885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   float x;
169885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (x=-11.0;x<24.0;x+=0.0007)
170885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
171885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      float error = fabs(x-(1.442695040888963387*log(celt_exp2(x))));
172885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (error>0.0002)
173885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
174885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         fprintf (stderr, "celt_exp2 failed: fabs(x-(1.442695040888963387*log(celt_exp2(x))))>0.0005 (x = %f, error = %f)\n", x,error);
175885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         ret = 1;
176885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
177885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
178885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
179885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
180885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid testexp2log2(void)
181885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
182885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   float x;
183885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (x=-11.0;x<24.0;x+=0.0007)
184885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
185885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      float error = fabs(x-(celt_log2(celt_exp2(x))));
186885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (error>0.001)
187885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
188885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_log2(celt_exp2(x))))>0.001 (x = %f, error = %f)\n", x,error);
189885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         ret = 1;
190885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
191885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
192885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
193885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#else
194885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid testlog2(void)
195885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
196885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_val32 x;
197885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (x=8;x<1073741824;x+=(x>>3))
198885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
199885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      float error = fabs((1.442695040888963387*log(x/16384.0))-celt_log2(x)/1024.0);
200885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (error>0.003)
201885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
202885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         fprintf (stderr, "celt_log2 failed: x = %ld, error = %f\n", (long)x,error);
203885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         ret = 1;
204885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
205885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
206885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
207885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
208885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid testexp2(void)
209885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
210885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_val16 x;
211885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (x=-32768;x<15360;x++)
212885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
213885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      float error1 = fabs(x/1024.0-(1.442695040888963387*log(celt_exp2(x)/65536.0)));
214885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      float error2 = fabs(exp(0.6931471805599453094*x/1024.0)-celt_exp2(x)/65536.0);
215885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (error1>0.0002&&error2>0.00004)
216885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
217885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    	 fprintf (stderr, "celt_exp2 failed: x = "WORD", error1 = %f, error2 = %f\n", x,error1,error2);
218885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         ret = 1;
219885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
220885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
221885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
222885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
223885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid testexp2log2(void)
224885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
225885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_val32 x;
226885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (x=8;x<65536;x+=(x>>3))
227885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
228885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      float error = fabs(x-0.25*celt_exp2(celt_log2(x)))/16384;
229885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (error>0.004)
230885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
231885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         fprintf (stderr, "celt_log2/celt_exp2 failed: fabs(x-(celt_exp2(celt_log2(x))))>0.001 (x = %ld, error = %f)\n", (long)x,error);
232885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         ret = 1;
233885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
234885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
235885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
236885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
237885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid testilog2(void)
238885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
239885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_val32 x;
240885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (x=1;x<=268435455;x+=127)
241885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
242885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_val32 lg;
243885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_val32 y;
244885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
245885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      lg = celt_ilog2(x);
246885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (lg<0 || lg>=31)
247885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
248885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         printf("celt_ilog2 failed: 0<=celt_ilog2(x)<31 (x = %d, celt_ilog2(x) = %d)\n",x,lg);
249885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         ret = 1;
250885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
251885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      y = 1<<lg;
252885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
253885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (x<y || (x>>1)>=y)
254885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
255885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         printf("celt_ilog2 failed: 2**celt_ilog2(x)<=x<2**(celt_ilog2(x)+1) (x = %d, 2**celt_ilog2(x) = %d)\n",x,y);
256885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         ret = 1;
257885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
258885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
259885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
260885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
261885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
262885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgint main(void)
263885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
264885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   testbitexactcos();
265885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   testbitexactlog2tan();
266885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   testdiv();
267885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   testsqrt();
268885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   testlog2();
269885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   testexp2();
270885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   testexp2log2();
271885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef FIXED_POINT
272885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   testilog2();
273885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
274885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   return ret;
275885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
276