1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2006 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker /** 18*795d594fSAndroid Build Coastguard Worker * Test arithmetic operations. 19*795d594fSAndroid Build Coastguard Worker */ 20*795d594fSAndroid Build Coastguard Worker public class FloatMath { 21*795d594fSAndroid Build Coastguard Worker convTest()22*795d594fSAndroid Build Coastguard Worker static void convTest() { 23*795d594fSAndroid Build Coastguard Worker System.out.println("FloatMath.convTest"); 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker float f; 26*795d594fSAndroid Build Coastguard Worker double d; 27*795d594fSAndroid Build Coastguard Worker int i; 28*795d594fSAndroid Build Coastguard Worker long l; 29*795d594fSAndroid Build Coastguard Worker 30*795d594fSAndroid Build Coastguard Worker /* float --> int */ 31*795d594fSAndroid Build Coastguard Worker f = 1234.5678f; 32*795d594fSAndroid Build Coastguard Worker i = (int) f; 33*795d594fSAndroid Build Coastguard Worker Main.assertTrue(i == 1234); 34*795d594fSAndroid Build Coastguard Worker 35*795d594fSAndroid Build Coastguard Worker f = -1234.5678f; 36*795d594fSAndroid Build Coastguard Worker i = (int) f; 37*795d594fSAndroid Build Coastguard Worker Main.assertTrue(i == -1234); 38*795d594fSAndroid Build Coastguard Worker 39*795d594fSAndroid Build Coastguard Worker /* float --> long */ 40*795d594fSAndroid Build Coastguard Worker f = 1238.5678f; 41*795d594fSAndroid Build Coastguard Worker l = (long) f; 42*795d594fSAndroid Build Coastguard Worker Main.assertTrue(l == 1238); 43*795d594fSAndroid Build Coastguard Worker 44*795d594fSAndroid Build Coastguard Worker f = -1238.5678f; 45*795d594fSAndroid Build Coastguard Worker l = (long) f; 46*795d594fSAndroid Build Coastguard Worker Main.assertTrue(l == -1238); 47*795d594fSAndroid Build Coastguard Worker 48*795d594fSAndroid Build Coastguard Worker /* float --> double */ 49*795d594fSAndroid Build Coastguard Worker f = 1238.5678f; 50*795d594fSAndroid Build Coastguard Worker d = (double) f; 51*795d594fSAndroid Build Coastguard Worker Main.assertTrue(d > 1238.567 && d < 1238.568); 52*795d594fSAndroid Build Coastguard Worker 53*795d594fSAndroid Build Coastguard Worker /* double --> int */ 54*795d594fSAndroid Build Coastguard Worker d = 1234.5678; 55*795d594fSAndroid Build Coastguard Worker i = (int) d; 56*795d594fSAndroid Build Coastguard Worker Main.assertTrue(i == 1234); 57*795d594fSAndroid Build Coastguard Worker 58*795d594fSAndroid Build Coastguard Worker d = -1234.5678; 59*795d594fSAndroid Build Coastguard Worker i = (int) d; 60*795d594fSAndroid Build Coastguard Worker Main.assertTrue(i == -1234); 61*795d594fSAndroid Build Coastguard Worker 62*795d594fSAndroid Build Coastguard Worker /* double --> long */ 63*795d594fSAndroid Build Coastguard Worker d = 5678956789.0123; 64*795d594fSAndroid Build Coastguard Worker l = (long) d; 65*795d594fSAndroid Build Coastguard Worker Main.assertTrue(l == 5678956789L); 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker d = -5678956789.0123; 68*795d594fSAndroid Build Coastguard Worker l = (long) d; 69*795d594fSAndroid Build Coastguard Worker Main.assertTrue(l == -5678956789L); 70*795d594fSAndroid Build Coastguard Worker 71*795d594fSAndroid Build Coastguard Worker /* double --> float */ 72*795d594fSAndroid Build Coastguard Worker d = 1238.5678; 73*795d594fSAndroid Build Coastguard Worker f = (float) d; 74*795d594fSAndroid Build Coastguard Worker Main.assertTrue(f > 1238.567 && f < 1238.568); 75*795d594fSAndroid Build Coastguard Worker 76*795d594fSAndroid Build Coastguard Worker /* int --> long */ 77*795d594fSAndroid Build Coastguard Worker i = 7654; 78*795d594fSAndroid Build Coastguard Worker l = (long) i; 79*795d594fSAndroid Build Coastguard Worker Main.assertTrue(l == 7654L); 80*795d594fSAndroid Build Coastguard Worker 81*795d594fSAndroid Build Coastguard Worker i = -7654; 82*795d594fSAndroid Build Coastguard Worker l = (long) i; 83*795d594fSAndroid Build Coastguard Worker Main.assertTrue(l == -7654L); 84*795d594fSAndroid Build Coastguard Worker 85*795d594fSAndroid Build Coastguard Worker /* int --> float */ 86*795d594fSAndroid Build Coastguard Worker i = 1234; 87*795d594fSAndroid Build Coastguard Worker f = (float) i; 88*795d594fSAndroid Build Coastguard Worker Main.assertTrue(f > 1233.9f && f < 1234.1f); 89*795d594fSAndroid Build Coastguard Worker 90*795d594fSAndroid Build Coastguard Worker i = -1234; 91*795d594fSAndroid Build Coastguard Worker f = (float) i; 92*795d594fSAndroid Build Coastguard Worker Main.assertTrue(f < -1233.9f && f > -1234.1f); 93*795d594fSAndroid Build Coastguard Worker 94*795d594fSAndroid Build Coastguard Worker /* int --> double */ 95*795d594fSAndroid Build Coastguard Worker i = 1238; 96*795d594fSAndroid Build Coastguard Worker d = (double) i; 97*795d594fSAndroid Build Coastguard Worker Main.assertTrue(d > 1237.9f && d < 1238.1f); 98*795d594fSAndroid Build Coastguard Worker 99*795d594fSAndroid Build Coastguard Worker i = -1238; 100*795d594fSAndroid Build Coastguard Worker d = (double) i; 101*795d594fSAndroid Build Coastguard Worker Main.assertTrue(d < -1237.9f && d > -1238.1f); 102*795d594fSAndroid Build Coastguard Worker 103*795d594fSAndroid Build Coastguard Worker /* long --> int (with truncation) */ 104*795d594fSAndroid Build Coastguard Worker l = 5678956789L; 105*795d594fSAndroid Build Coastguard Worker i = (int) l; 106*795d594fSAndroid Build Coastguard Worker Main.assertTrue(i == 1383989493); 107*795d594fSAndroid Build Coastguard Worker 108*795d594fSAndroid Build Coastguard Worker l = -5678956789L; 109*795d594fSAndroid Build Coastguard Worker i = (int) l; 110*795d594fSAndroid Build Coastguard Worker Main.assertTrue(i == -1383989493); 111*795d594fSAndroid Build Coastguard Worker 112*795d594fSAndroid Build Coastguard Worker /* long --> float */ 113*795d594fSAndroid Build Coastguard Worker l = 5678956789L; 114*795d594fSAndroid Build Coastguard Worker f = (float) l; 115*795d594fSAndroid Build Coastguard Worker Main.assertTrue(f > 5.6789564E9 && f < 5.6789566E9); 116*795d594fSAndroid Build Coastguard Worker 117*795d594fSAndroid Build Coastguard Worker l = -5678956789L; 118*795d594fSAndroid Build Coastguard Worker f = (float) l; 119*795d594fSAndroid Build Coastguard Worker Main.assertTrue(f < -5.6789564E9 && f > -5.6789566E9); 120*795d594fSAndroid Build Coastguard Worker 121*795d594fSAndroid Build Coastguard Worker /* long --> double */ 122*795d594fSAndroid Build Coastguard Worker l = 6678956789L; 123*795d594fSAndroid Build Coastguard Worker d = (double) l; 124*795d594fSAndroid Build Coastguard Worker Main.assertTrue(d > 6.6789567E9 && d < 6.6789568E9); 125*795d594fSAndroid Build Coastguard Worker 126*795d594fSAndroid Build Coastguard Worker l = -6678956789L; 127*795d594fSAndroid Build Coastguard Worker d = (double) l; 128*795d594fSAndroid Build Coastguard Worker Main.assertTrue(d < -6.6789567E9 && d > -6.6789568E9); 129*795d594fSAndroid Build Coastguard Worker } 130*795d594fSAndroid Build Coastguard Worker 131*795d594fSAndroid Build Coastguard Worker /* 132*795d594fSAndroid Build Coastguard Worker * We pass in the arguments and return the results so the compiler 133*795d594fSAndroid Build Coastguard Worker * doesn't do the math for us. 134*795d594fSAndroid Build Coastguard Worker */ floatOperTest(float x, float y)135*795d594fSAndroid Build Coastguard Worker static float[] floatOperTest(float x, float y) { 136*795d594fSAndroid Build Coastguard Worker System.out.println("FloatMath.floatOperTest"); 137*795d594fSAndroid Build Coastguard Worker 138*795d594fSAndroid Build Coastguard Worker float[] results = new float[10]; 139*795d594fSAndroid Build Coastguard Worker float tmp; 140*795d594fSAndroid Build Coastguard Worker 141*795d594fSAndroid Build Coastguard Worker /* this seems to generate "op-float" instructions */ 142*795d594fSAndroid Build Coastguard Worker results[0] = x + y; 143*795d594fSAndroid Build Coastguard Worker results[1] = x - y; 144*795d594fSAndroid Build Coastguard Worker results[2] = x * y; 145*795d594fSAndroid Build Coastguard Worker results[3] = x / y; 146*795d594fSAndroid Build Coastguard Worker results[4] = x % -y; 147*795d594fSAndroid Build Coastguard Worker 148*795d594fSAndroid Build Coastguard Worker /* this seems to generate "op-float/2addr" instructions */ 149*795d594fSAndroid Build Coastguard Worker tmp = x; 150*795d594fSAndroid Build Coastguard Worker tmp += y; 151*795d594fSAndroid Build Coastguard Worker results[5] = tmp; 152*795d594fSAndroid Build Coastguard Worker tmp = x; 153*795d594fSAndroid Build Coastguard Worker tmp -= y; 154*795d594fSAndroid Build Coastguard Worker results[6] = tmp; 155*795d594fSAndroid Build Coastguard Worker tmp = x; 156*795d594fSAndroid Build Coastguard Worker tmp *= y; 157*795d594fSAndroid Build Coastguard Worker results[7] = tmp; 158*795d594fSAndroid Build Coastguard Worker tmp = x; 159*795d594fSAndroid Build Coastguard Worker tmp /= y; 160*795d594fSAndroid Build Coastguard Worker results[8] = tmp; 161*795d594fSAndroid Build Coastguard Worker tmp = x; 162*795d594fSAndroid Build Coastguard Worker tmp %= -y; 163*795d594fSAndroid Build Coastguard Worker results[9] = tmp; 164*795d594fSAndroid Build Coastguard Worker 165*795d594fSAndroid Build Coastguard Worker return results; 166*795d594fSAndroid Build Coastguard Worker } floatOperCheck(float[] results)167*795d594fSAndroid Build Coastguard Worker static void floatOperCheck(float[] results) { 168*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[0] > 69996.99f && results[0] < 69997.01f); 169*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[1] > 70002.99f && results[1] < 70003.01f); 170*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[2] > -210000.01f && results[2] < -209999.99f); 171*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[3] > -23333.34f && results[3] < -23333.32f); 172*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[4] > 0.999f && results[4] < 1.001f); 173*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[5] > 69996.99f && results[5] < 69997.01f); 174*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[6] > 70002.99f && results[6] < 70003.01f); 175*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[7] > -210000.01f && results[7] < -209999.99f); 176*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[8] > -23333.34f && results[8] < -23333.32f); 177*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[9] > 0.999f && results[9] < 1.001f); 178*795d594fSAndroid Build Coastguard Worker } 179*795d594fSAndroid Build Coastguard Worker 180*795d594fSAndroid Build Coastguard Worker /* 181*795d594fSAndroid Build Coastguard Worker * We pass in the arguments and return the results so the compiler 182*795d594fSAndroid Build Coastguard Worker * doesn't do the math for us. 183*795d594fSAndroid Build Coastguard Worker */ doubleOperTest(double x, double y)184*795d594fSAndroid Build Coastguard Worker static double[] doubleOperTest(double x, double y) { 185*795d594fSAndroid Build Coastguard Worker System.out.println("FloatMath.doubleOperTest"); 186*795d594fSAndroid Build Coastguard Worker 187*795d594fSAndroid Build Coastguard Worker double[] results = new double[10]; 188*795d594fSAndroid Build Coastguard Worker double tmp; 189*795d594fSAndroid Build Coastguard Worker 190*795d594fSAndroid Build Coastguard Worker /* this seems to generate "op-double" instructions */ 191*795d594fSAndroid Build Coastguard Worker results[0] = x + y; 192*795d594fSAndroid Build Coastguard Worker results[1] = x - y; 193*795d594fSAndroid Build Coastguard Worker results[2] = x * y; 194*795d594fSAndroid Build Coastguard Worker results[3] = x / y; 195*795d594fSAndroid Build Coastguard Worker results[4] = x % -y; 196*795d594fSAndroid Build Coastguard Worker 197*795d594fSAndroid Build Coastguard Worker /* this seems to generate "op-double/2addr" instructions */ 198*795d594fSAndroid Build Coastguard Worker tmp = x; 199*795d594fSAndroid Build Coastguard Worker tmp += y; 200*795d594fSAndroid Build Coastguard Worker results[5] = tmp; 201*795d594fSAndroid Build Coastguard Worker tmp = x; 202*795d594fSAndroid Build Coastguard Worker tmp -= y; 203*795d594fSAndroid Build Coastguard Worker results[6] = tmp; 204*795d594fSAndroid Build Coastguard Worker tmp = x; 205*795d594fSAndroid Build Coastguard Worker tmp *= y; 206*795d594fSAndroid Build Coastguard Worker results[7] = tmp; 207*795d594fSAndroid Build Coastguard Worker tmp = x; 208*795d594fSAndroid Build Coastguard Worker tmp /= y; 209*795d594fSAndroid Build Coastguard Worker results[8] = tmp; 210*795d594fSAndroid Build Coastguard Worker tmp = x; 211*795d594fSAndroid Build Coastguard Worker tmp %= -y; 212*795d594fSAndroid Build Coastguard Worker results[9] = tmp; 213*795d594fSAndroid Build Coastguard Worker 214*795d594fSAndroid Build Coastguard Worker return results; 215*795d594fSAndroid Build Coastguard Worker } doubleOperCheck(double[] results)216*795d594fSAndroid Build Coastguard Worker static void doubleOperCheck(double[] results) { 217*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[0] > 69996.99 && results[0] < 69997.01); 218*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[1] > 70002.99 && results[1] < 70003.01); 219*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[2] > -210000.01 && results[2] < -209999.99); 220*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[3] > -23333.34 && results[3] < -23333.32); 221*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[4] > 0.999 && results[4] < 1.001); 222*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[5] > 69996.99 && results[5] < 69997.01); 223*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[6] > 70002.99 && results[6] < 70003.01); 224*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[7] > -210000.01 && results[7] < -209999.99); 225*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[8] > -23333.34 && results[8] < -23333.32); 226*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[9] > 0.999 && results[9] < 1.001); 227*795d594fSAndroid Build Coastguard Worker } 228*795d594fSAndroid Build Coastguard Worker 229*795d594fSAndroid Build Coastguard Worker /* 230*795d594fSAndroid Build Coastguard Worker * Try to cause some unary operations. 231*795d594fSAndroid Build Coastguard Worker */ unopTest(float f)232*795d594fSAndroid Build Coastguard Worker static float unopTest(float f) { 233*795d594fSAndroid Build Coastguard Worker f = -f; 234*795d594fSAndroid Build Coastguard Worker return f; 235*795d594fSAndroid Build Coastguard Worker } 236*795d594fSAndroid Build Coastguard Worker convI(long l, float f, double d, float zero)237*795d594fSAndroid Build Coastguard Worker static int[] convI(long l, float f, double d, float zero) { 238*795d594fSAndroid Build Coastguard Worker int[] results = new int[6]; 239*795d594fSAndroid Build Coastguard Worker results[0] = (int) l; 240*795d594fSAndroid Build Coastguard Worker results[1] = (int) f; 241*795d594fSAndroid Build Coastguard Worker results[2] = (int) d; 242*795d594fSAndroid Build Coastguard Worker results[3] = (int) (1.0f / zero); // +inf 243*795d594fSAndroid Build Coastguard Worker results[4] = (int) (-1.0f / zero); // -inf 244*795d594fSAndroid Build Coastguard Worker results[5] = (int) ((1.0f / zero) / (1.0f / zero)); // NaN 245*795d594fSAndroid Build Coastguard Worker return results; 246*795d594fSAndroid Build Coastguard Worker } checkConvI(int[] results)247*795d594fSAndroid Build Coastguard Worker static void checkConvI(int[] results) { 248*795d594fSAndroid Build Coastguard Worker System.out.println("FloatMath.checkConvI"); 249*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[0] == 0x44332211); 250*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[1] == 123); 251*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[2] == -3); 252*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[3] == 0x7fffffff); 253*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[4] == 0x80000000); 254*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[5] == 0); 255*795d594fSAndroid Build Coastguard Worker } 256*795d594fSAndroid Build Coastguard Worker convL(int i, float f, double d, double zero)257*795d594fSAndroid Build Coastguard Worker static long[] convL(int i, float f, double d, double zero) { 258*795d594fSAndroid Build Coastguard Worker long[] results = new long[6]; 259*795d594fSAndroid Build Coastguard Worker results[0] = (long) i; 260*795d594fSAndroid Build Coastguard Worker results[1] = (long) f; 261*795d594fSAndroid Build Coastguard Worker results[2] = (long) d; 262*795d594fSAndroid Build Coastguard Worker results[3] = (long) (1.0 / zero); // +inf 263*795d594fSAndroid Build Coastguard Worker results[4] = (long) (-1.0 / zero); // -inf 264*795d594fSAndroid Build Coastguard Worker results[5] = (long) ((1.0 / zero) / (1.0 / zero)); // NaN 265*795d594fSAndroid Build Coastguard Worker return results; 266*795d594fSAndroid Build Coastguard Worker } checkConvL(long[] results)267*795d594fSAndroid Build Coastguard Worker static void checkConvL(long[] results) { 268*795d594fSAndroid Build Coastguard Worker System.out.println("FloatMath.checkConvL"); 269*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[0] == 0xFFFFFFFF88776655L); 270*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[1] == 123); 271*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[2] == -3); 272*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[3] == 0x7fffffffffffffffL); 273*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[4] == 0x8000000000000000L); 274*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[5] == 0); 275*795d594fSAndroid Build Coastguard Worker } 276*795d594fSAndroid Build Coastguard Worker convF(int i, long l, double d)277*795d594fSAndroid Build Coastguard Worker static float[] convF(int i, long l, double d) { 278*795d594fSAndroid Build Coastguard Worker float[] results = new float[3]; 279*795d594fSAndroid Build Coastguard Worker results[0] = (float) i; 280*795d594fSAndroid Build Coastguard Worker results[1] = (float) l; 281*795d594fSAndroid Build Coastguard Worker results[2] = (float) d; 282*795d594fSAndroid Build Coastguard Worker return results; 283*795d594fSAndroid Build Coastguard Worker } checkConvF(float[] results)284*795d594fSAndroid Build Coastguard Worker static void checkConvF(float[] results) { 285*795d594fSAndroid Build Coastguard Worker System.out.println("FloatMath.checkConvF"); 286*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[0] == -2.0054409E9f); 287*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[1] == -8.613303E18f); 288*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[2] == -3.1415927f); 289*795d594fSAndroid Build Coastguard Worker } 290*795d594fSAndroid Build Coastguard Worker convD(int i, long l, float f)291*795d594fSAndroid Build Coastguard Worker static double[] convD(int i, long l, float f) { 292*795d594fSAndroid Build Coastguard Worker double[] results = new double[3]; 293*795d594fSAndroid Build Coastguard Worker results[0] = (double) i; 294*795d594fSAndroid Build Coastguard Worker results[1] = (double) l; 295*795d594fSAndroid Build Coastguard Worker results[2] = (double) f; 296*795d594fSAndroid Build Coastguard Worker return results; 297*795d594fSAndroid Build Coastguard Worker } checkConvD(double[] results)298*795d594fSAndroid Build Coastguard Worker static void checkConvD(double[] results) { 299*795d594fSAndroid Build Coastguard Worker System.out.println("FloatMath.checkConvD"); 300*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[0] == -2.005440939E9); 301*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[1] == -8.6133032459203287E18); 302*795d594fSAndroid Build Coastguard Worker Main.assertTrue(results[2] == 123.45600128173828); 303*795d594fSAndroid Build Coastguard Worker } 304*795d594fSAndroid Build Coastguard Worker checkConsts()305*795d594fSAndroid Build Coastguard Worker static void checkConsts() { 306*795d594fSAndroid Build Coastguard Worker System.out.println("FloatMath.checkConsts"); 307*795d594fSAndroid Build Coastguard Worker 308*795d594fSAndroid Build Coastguard Worker float f = 10.0f; // const/special 309*795d594fSAndroid Build Coastguard Worker Main.assertTrue(f > 9.9 && f < 10.1); 310*795d594fSAndroid Build Coastguard Worker 311*795d594fSAndroid Build Coastguard Worker double d = 10.0; // const-wide/special 312*795d594fSAndroid Build Coastguard Worker Main.assertTrue(d > 9.9 && d < 10.1); 313*795d594fSAndroid Build Coastguard Worker } 314*795d594fSAndroid Build Coastguard Worker 315*795d594fSAndroid Build Coastguard Worker /* 316*795d594fSAndroid Build Coastguard Worker * Determine if two floating point numbers are approximately equal. 317*795d594fSAndroid Build Coastguard Worker * 318*795d594fSAndroid Build Coastguard Worker * (Assumes that floating point is generally working, so we can't use 319*795d594fSAndroid Build Coastguard Worker * this for the first set of tests.) 320*795d594fSAndroid Build Coastguard Worker */ approxEqual(float a, float b, float maxDelta)321*795d594fSAndroid Build Coastguard Worker static boolean approxEqual(float a, float b, float maxDelta) { 322*795d594fSAndroid Build Coastguard Worker if (a > b) 323*795d594fSAndroid Build Coastguard Worker return (a - b) < maxDelta; 324*795d594fSAndroid Build Coastguard Worker else 325*795d594fSAndroid Build Coastguard Worker return (b - a) < maxDelta; 326*795d594fSAndroid Build Coastguard Worker } approxEqual(double a, double b, double maxDelta)327*795d594fSAndroid Build Coastguard Worker static boolean approxEqual(double a, double b, double maxDelta) { 328*795d594fSAndroid Build Coastguard Worker if (a > b) 329*795d594fSAndroid Build Coastguard Worker return (a - b) < maxDelta; 330*795d594fSAndroid Build Coastguard Worker else 331*795d594fSAndroid Build Coastguard Worker return (b - a) < maxDelta; 332*795d594fSAndroid Build Coastguard Worker } 333*795d594fSAndroid Build Coastguard Worker 334*795d594fSAndroid Build Coastguard Worker /* 335*795d594fSAndroid Build Coastguard Worker * Test some java.lang.Math functions. 336*795d594fSAndroid Build Coastguard Worker * 337*795d594fSAndroid Build Coastguard Worker * The method arguments are positive values. 338*795d594fSAndroid Build Coastguard Worker */ jlmTests(float ff, double dd)339*795d594fSAndroid Build Coastguard Worker static void jlmTests(float ff, double dd) { 340*795d594fSAndroid Build Coastguard Worker System.out.println("FloatMath.jlmTests"); 341*795d594fSAndroid Build Coastguard Worker 342*795d594fSAndroid Build Coastguard Worker Main.assertTrue(approxEqual(Math.abs(ff), ff, 0.001f)); 343*795d594fSAndroid Build Coastguard Worker Main.assertTrue(approxEqual(Math.abs(-ff), ff, 0.001f)); 344*795d594fSAndroid Build Coastguard Worker Main.assertTrue(approxEqual(Math.min(ff, -5.0f), -5.0f, 0.001f)); 345*795d594fSAndroid Build Coastguard Worker Main.assertTrue(approxEqual(Math.max(ff, -5.0f), ff, 0.001f)); 346*795d594fSAndroid Build Coastguard Worker 347*795d594fSAndroid Build Coastguard Worker Main.assertTrue(approxEqual(Math.abs(dd), dd, 0.001)); 348*795d594fSAndroid Build Coastguard Worker Main.assertTrue(approxEqual(Math.abs(-dd), dd, 0.001)); 349*795d594fSAndroid Build Coastguard Worker Main.assertTrue(approxEqual(Math.min(dd, -5.0), -5.0, 0.001)); 350*795d594fSAndroid Build Coastguard Worker Main.assertTrue(approxEqual(Math.max(dd, -5.0), dd, 0.001)); 351*795d594fSAndroid Build Coastguard Worker 352*795d594fSAndroid Build Coastguard Worker double sq = Math.sqrt(dd); 353*795d594fSAndroid Build Coastguard Worker Main.assertTrue(approxEqual(sq*sq, dd, 0.001)); 354*795d594fSAndroid Build Coastguard Worker 355*795d594fSAndroid Build Coastguard Worker Main.assertTrue(approxEqual(0.5403023058681398, Math.cos(1.0), 0.00000001)); 356*795d594fSAndroid Build Coastguard Worker Main.assertTrue(approxEqual(0.8414709848078965, Math.sin(1.0), 0.00000001)); 357*795d594fSAndroid Build Coastguard Worker } 358*795d594fSAndroid Build Coastguard Worker run()359*795d594fSAndroid Build Coastguard Worker public static void run() { 360*795d594fSAndroid Build Coastguard Worker convTest(); 361*795d594fSAndroid Build Coastguard Worker 362*795d594fSAndroid Build Coastguard Worker float[] floatResults; 363*795d594fSAndroid Build Coastguard Worker double[] doubleResults; 364*795d594fSAndroid Build Coastguard Worker int[] intResults; 365*795d594fSAndroid Build Coastguard Worker long[] longResults; 366*795d594fSAndroid Build Coastguard Worker 367*795d594fSAndroid Build Coastguard Worker floatResults = floatOperTest(70000.0f, -3.0f); 368*795d594fSAndroid Build Coastguard Worker floatOperCheck(floatResults); 369*795d594fSAndroid Build Coastguard Worker doubleResults = doubleOperTest(70000.0, -3.0); 370*795d594fSAndroid Build Coastguard Worker doubleOperCheck(doubleResults); 371*795d594fSAndroid Build Coastguard Worker 372*795d594fSAndroid Build Coastguard Worker intResults = convI(0x8877665544332211L, 123.456f, -3.1415926535, 0.0f); 373*795d594fSAndroid Build Coastguard Worker checkConvI(intResults); 374*795d594fSAndroid Build Coastguard Worker longResults = convL(0x88776655, 123.456f, -3.1415926535, 0.0); 375*795d594fSAndroid Build Coastguard Worker checkConvL(longResults); 376*795d594fSAndroid Build Coastguard Worker floatResults = convF(0x88776655, 0x8877665544332211L, -3.1415926535); 377*795d594fSAndroid Build Coastguard Worker checkConvF(floatResults); 378*795d594fSAndroid Build Coastguard Worker doubleResults = convD(0x88776655, 0x8877665544332211L, 123.456f); 379*795d594fSAndroid Build Coastguard Worker checkConvD(doubleResults); 380*795d594fSAndroid Build Coastguard Worker 381*795d594fSAndroid Build Coastguard Worker unopTest(123.456f); 382*795d594fSAndroid Build Coastguard Worker 383*795d594fSAndroid Build Coastguard Worker checkConsts(); 384*795d594fSAndroid Build Coastguard Worker 385*795d594fSAndroid Build Coastguard Worker jlmTests(3.14159f, 123456.78987654321); 386*795d594fSAndroid Build Coastguard Worker } 387*795d594fSAndroid Build Coastguard Worker } 388