diff options
Diffstat (limited to 'tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/math_err.rs')
-rw-r--r-- | tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/math_err.rs | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/math_err.rs b/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/math_err.rs new file mode 100644 index 0000000..a26770b --- /dev/null +++ b/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/math_err.rs @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma version(1) +#pragma rs java_package_name(com.example.android.rs.matherr) + +typedef union +{ + float fv; + int32_t iv; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i,d) \ +do { \ + ieee_float_shape_type gf_u; \ + gf_u.fv = (d); \ + (i) = gf_u.iv; \ +} while (0) + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d,i) \ +do { \ + ieee_float_shape_type sf_u; \ + sf_u.iv = (i); \ + (d) = sf_u.fv; \ +} while (0) + + +static float fast_log2(float v) { + int32_t ibits; + GET_FLOAT_WORD(ibits, v); + + int32_t e = (ibits >> 23) & 0xff; + + ibits &= 0x7fffff; + ibits |= 127 << 23; + + float ir; + SET_FLOAT_WORD(ir, ibits); + + ir -= 1.5f; + float ir2 = ir*ir; + float adj2 = 0.405465108f + // -0.00009f + + (0.666666667f * ir) - + (0.222222222f * ir2) + + (0.098765432f * ir*ir2) - + (0.049382716f * ir2*ir2) + + (0.026337449f * ir*ir2*ir2) - + (0.014631916f * ir2*ir2*ir2); + adj2 *= (1.f / 0.693147181f); + + return (float)(e - 127) + adj2; +} + +void testExp2(const float *in, float *out) { + float i = *in; + if (i > (-125.f) && i < 125.f) { + *out = native_exp2(i); + } else { + *out = exp2(i); + } + *out = native_exp2(i); +} + +void testLog2(const float *in, float *out) { + *out = fast_log2(*in); +} + |