xref: /aosp_15_r20/art/test/003-omnibus-opcodes/src/FloatMath.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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