blob: 535cafb113bd68bcf0edfd256e0a519a32f8b70a [file] [log] [blame]
Calin Juravle7c4954d2014-10-28 16:57:40 +00001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// Note that $opt$ is a marker for the optimizing compiler to ensure
18// it does compile the method.
19public class Main {
20
21 public static void expectEquals(float expected, float result) {
22 if (expected != result) {
23 throw new Error("Expected: " + expected + ", found: " + result);
24 }
25 }
26
27 public static void expectEquals(double expected, double result) {
28 if (expected != result) {
29 throw new Error("Expected: " + expected + ", found: " + result);
30 }
31 }
32
33 public static void expectApproxEquals(float a, float b) {
34 float maxDelta = 0.00001F;
35 boolean aproxEquals = (a > b) ? ((a - b) < maxDelta) : ((b - a) < maxDelta);
36 if (!aproxEquals) {
37 throw new Error("Expected: " + a + ", found: " + b
38 + ", with delta: " + maxDelta + " " + (a - b));
39 }
40 }
41
42 public static void expectApproxEquals(double a, double b) {
43 double maxDelta = 0.00001D;
44 boolean aproxEquals = (a > b) ? ((a - b) < maxDelta) : ((b - a) < maxDelta);
45 if (!aproxEquals) {
46 throw new Error("Expected: " + a + ", found: "
47 + b + ", with delta: " + maxDelta + " " + (a - b));
48 }
49 }
50
51 public static void expectNaN(float a) {
52 if (a == a) {
53 throw new Error("Expected NaN: " + a);
54 }
55 }
56
57 public static void expectNaN(double a) {
58 if (a == a) {
59 throw new Error("Expected NaN: " + a);
60 }
61 }
62
63 public static void main(String[] args) {
64 div();
65 }
66
67 public static void div() {
68 divFloat();
69 divDouble();
70 }
71
72 private static void divFloat() {
73 expectApproxEquals(1.6666666F, $opt$Div(5F, 3F));
74 expectApproxEquals(0F, $opt$Div(0F, 3F));
75 expectApproxEquals(-0.3333333F, $opt$Div(1F, -3F));
76 expectApproxEquals(4F, $opt$Div(-12F, -3F));
77 expectApproxEquals(0.5, $opt$Div(0.1F, 0.2F));
78 expectApproxEquals(-2.5F, $opt$Div(-0.5F, 0.2F));
79
80 expectEquals(0F, $opt$Div(0F, Float.POSITIVE_INFINITY));
81 expectEquals(0F, $opt$Div(11F, Float.POSITIVE_INFINITY));
82 expectEquals(0F, $opt$Div(0F, Float.NEGATIVE_INFINITY));
83 expectEquals(0F, $opt$Div(11F, Float.NEGATIVE_INFINITY));
84
85 expectNaN($opt$Div(0F, 0F));
86 expectNaN($opt$Div(Float.NaN, 11F));
87 expectNaN($opt$Div(-11F, Float.NaN));
88 expectNaN($opt$Div(Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY));
89 expectNaN($opt$Div(Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY));
90 expectNaN($opt$Div(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY));
91 expectNaN($opt$Div(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY));
92 expectNaN($opt$Div(Float.NaN, Float.NEGATIVE_INFINITY));
93 expectNaN($opt$Div(Float.POSITIVE_INFINITY, Float.NaN));
94
95 expectEquals(Float.POSITIVE_INFINITY, $opt$Div(3F, 0F));
96 expectEquals(Float.NEGATIVE_INFINITY, $opt$Div(-3F, 0F));
97 expectEquals(Float.POSITIVE_INFINITY, $opt$Div(Float.MAX_VALUE, Float.MIN_VALUE));
98 expectEquals(Float.NEGATIVE_INFINITY, $opt$Div(-Float.MAX_VALUE, Float.MIN_VALUE));
99 }
100
101 private static void divDouble() {
102 expectApproxEquals(1.6666666D, $opt$Div(5D, 3D));
103 expectApproxEquals(0D, $opt$Div(0D, 3D));
104 expectApproxEquals(-0.3333333D, $opt$Div(1D, -3D));
105 expectApproxEquals(4D, $opt$Div(-12D, -3D));
106 expectApproxEquals(0.5, $opt$Div(0.1D, 0.2D));
107 expectApproxEquals(-2.5D, $opt$Div(-0.5D, 0.2D));
108
109 expectEquals(0D, $opt$Div(0D, Float.POSITIVE_INFINITY));
110 expectEquals(0D, $opt$Div(11D, Float.POSITIVE_INFINITY));
111 expectEquals(0D, $opt$Div(0D, Float.NEGATIVE_INFINITY));
112 expectEquals(0D, $opt$Div(11D, Float.NEGATIVE_INFINITY));
113
114 expectNaN($opt$Div(0D, 0D));
115 expectNaN($opt$Div(Float.NaN, 11D));
116 expectNaN($opt$Div(-11D, Float.NaN));
117 expectNaN($opt$Div(Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY));
118 expectNaN($opt$Div(Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY));
119 expectNaN($opt$Div(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY));
120 expectNaN($opt$Div(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY));
121 expectNaN($opt$Div(Float.NaN, Float.NEGATIVE_INFINITY));
122 expectNaN($opt$Div(Float.POSITIVE_INFINITY, Float.NaN));
123
124 expectEquals(Float.POSITIVE_INFINITY, $opt$Div(3D, 0D));
125 expectEquals(Float.NEGATIVE_INFINITY, $opt$Div(-3D, 0D));
126 expectEquals(Float.POSITIVE_INFINITY, $opt$Div(Float.MAX_VALUE, Float.MIN_VALUE));
127 expectEquals(Float.NEGATIVE_INFINITY, $opt$Div(-Float.MAX_VALUE, Float.MIN_VALUE));
128 }
129
130 static float $opt$Div(float a, float b) {
131 return a / b;
132 }
133
134 static double $opt$Div(double a, double b) {
135 return a / b;
136 }
137}