1572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/*
2572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Copyright (C) 2013 The Android Open Source Project
3572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
4572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * you may not use this file except in compliance with the License.
6572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * You may obtain a copy of the License at
7572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
8572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
10572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Unless required by applicable law or agreed to in writing, software
11572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * See the License for the specific language governing permissions and
14572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * limitations under the License.
15572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams */
16572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
17572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspackage com.example.android.rs.matherr;
18572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
19572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.content.res.Resources;
20572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.*;
21572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.lang.Float;
22572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.lang.Math;
23572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
24572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspublic class MathErr {
25572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private RenderScript mRS;
26572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Allocation mAllocationSrc;
27572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private Allocation mAllocationRes;
28572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private ScriptC_math_err mScript;
29572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private java.util.Random mRand = new java.util.Random();
30572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
31572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private final int BUF_SIZE = 4096;
32572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    float mSrc[] = new float[BUF_SIZE];
33572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    float mRef[] = new float[BUF_SIZE];
34572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    float mRes[] = new float[BUF_SIZE];
35572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
36572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    MathErr(RenderScript rs) {
37572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mRS = rs;
38572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScript = new ScriptC_math_err(mRS);
39572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
40572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mAllocationSrc = Allocation.createSized(rs, Element.F32(rs), BUF_SIZE);
41572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mAllocationRes = Allocation.createSized(rs, Element.F32(rs), BUF_SIZE);
42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
43572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        testExp2();
44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        testLog2();
45572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
46572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
47572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void buildRand() {
48572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        for (int i=0; i < BUF_SIZE; i++) {
49572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mSrc[i] = (((float)i) / 9) - 200;
50572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            //mSrc[i] = Float.intBitsToFloat(mRand.nextInt());
51572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
52572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mAllocationSrc.copyFrom(mSrc);
53572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
54572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
55572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void logErr() {
56572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mAllocationRes.copyTo(mRes);
57572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        for (int i=0; i < BUF_SIZE; i++) {
58572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            int err = Float.floatToRawIntBits(mRef[i]) - Float.floatToRawIntBits(mRes[i]);
59572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            err = Math.abs(err);
60572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            if (err > 8096) {
61572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                android.util.Log.v("err", "error " + err + " src " + mSrc[i] + " ref " + mRef[i] + " res " + mRes[i]);
62572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
63572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
64572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
65572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
66572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void testExp2() {
67572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        android.util.Log.v("err", "testing exp2");
68572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        buildRand();
69572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScript.forEach_testExp2(mAllocationSrc, mAllocationRes);
70572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        for (int i=0; i < BUF_SIZE; i++) {
71572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mRef[i] = (float)Math.pow(2.f, mSrc[i]);
72572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
73572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        logErr();
74572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
75572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
76572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void testLog2() {
77572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        android.util.Log.v("err", "testing log2");
78572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        buildRand();
79572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScript.forEach_testLog2(mAllocationSrc, mAllocationRes);
80572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        for (int i=0; i < BUF_SIZE; i++) {
81572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mRef[i] = (float)Math.log(mSrc[i]) * 1.442695041f;
82572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
83572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        logErr();
84572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
85572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
86572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
87