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