blob: 03b76d70c8efbd8d4038de52f9311f516a9cb1ce [file] [log] [blame]
Aart Bik75a38b22016-02-17 10:41:50 -08001/*
2 * Copyright (C) 2016 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
Vladimir Markoc2a769d2020-04-21 18:06:43 +010017public class TestIsNan {
Aart Bik75a38b22016-02-17 10:41:50 -080018
Vladimir Markoc2a769d2020-04-21 18:06:43 +010019 /// CHECK-START: boolean TestIsNan.isNaN32(float) builder (after)
Aart Bik75a38b22016-02-17 10:41:50 -080020 /// CHECK-DAG: <<Result:z\d+>> NotEqual
21 /// CHECK-DAG: Return [<<Result>>]
22 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +010023 /// CHECK-START: boolean TestIsNan.isNaN32(float) builder (after)
Aart Bik75a38b22016-02-17 10:41:50 -080024 /// CHECK-NOT: InvokeStaticOrDirect
25 private static boolean isNaN32(float x) {
26 return Float.isNaN(x);
27 }
28
Vladimir Markoc2a769d2020-04-21 18:06:43 +010029 /// CHECK-START: boolean TestIsNan.isNaN64(double) builder (after)
Aart Bik75a38b22016-02-17 10:41:50 -080030 /// CHECK-DAG: <<Result:z\d+>> NotEqual
31 /// CHECK-DAG: Return [<<Result>>]
32 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +010033 /// CHECK-START: boolean TestIsNan.isNaN64(double) builder (after)
Aart Bik75a38b22016-02-17 10:41:50 -080034 /// CHECK-NOT: InvokeStaticOrDirect
35 private static boolean isNaN64(double x) {
36 return Double.isNaN(x);
37 }
38
Vladimir Markoc2a769d2020-04-21 18:06:43 +010039 public static void main() {
Aart Bik75a38b22016-02-17 10:41:50 -080040 // A few distinct numbers.
41 expectFalse(isNaN32(Float.NEGATIVE_INFINITY));
42 expectFalse(isNaN32(-1.0f));
43 expectFalse(isNaN32(-0.0f));
44 expectFalse(isNaN32(0.0f));
45 expectFalse(isNaN32(1.0f));
46 expectFalse(isNaN32(Float.POSITIVE_INFINITY));
47
48 // A few distinct subnormal numbers.
49 expectFalse(isNaN32(Float.intBitsToFloat(0x00400000)));
50 expectFalse(isNaN32(Float.intBitsToFloat(0x80400000)));
51 expectFalse(isNaN32(Float.intBitsToFloat(0x00000001)));
52 expectFalse(isNaN32(Float.intBitsToFloat(0x80000001)));
53
54 // A few NaN numbers.
55 expectTrue(isNaN32(Float.NaN));
56 expectTrue(isNaN32(0.0f / 0.0f));
57 expectTrue(isNaN32((float)Math.sqrt(-1.0f)));
58 float[] fvals = {
59 Float.intBitsToFloat(0x7f800001),
60 Float.intBitsToFloat(0x7fa00000),
61 Float.intBitsToFloat(0x7fc00000),
62 Float.intBitsToFloat(0x7fffffff),
63 Float.intBitsToFloat(0xff800001),
64 Float.intBitsToFloat(0xffa00000),
65 Float.intBitsToFloat(0xffc00000),
66 Float.intBitsToFloat(0xffffffff)
67 };
68 for (int i = 0; i < fvals.length; i++) {
69 expectTrue(isNaN32(fvals[i]));
70 }
71
72 // A few distinct numbers.
73 expectFalse(isNaN64(Double.NEGATIVE_INFINITY));
74 expectFalse(isNaN32(-1.0f));
75 expectFalse(isNaN64(-0.0d));
76 expectFalse(isNaN64(0.0d));
77 expectFalse(isNaN64(1.0d));
78 expectFalse(isNaN64(Double.POSITIVE_INFINITY));
79
80 // A few distinct subnormal numbers.
81 expectFalse(isNaN64(Double.longBitsToDouble(0x0008000000000000l)));
82 expectFalse(isNaN64(Double.longBitsToDouble(0x8008000000000000l)));
83 expectFalse(isNaN64(Double.longBitsToDouble(0x0000000000000001l)));
84 expectFalse(isNaN64(Double.longBitsToDouble(0x8000000000000001l)));
85
86 // A few NaN numbers.
87 expectTrue(isNaN64(Double.NaN));
88 expectTrue(isNaN64(0.0d / 0.0d));
89 expectTrue(isNaN64(Math.sqrt(-1.0d)));
90 double[] dvals = {
91 Double.longBitsToDouble(0x7ff0000000000001L),
92 Double.longBitsToDouble(0x7ff4000000000000L),
93 Double.longBitsToDouble(0x7ff8000000000000L),
94 Double.longBitsToDouble(0x7fffffffffffffffL),
95 Double.longBitsToDouble(0xfff0000000000001L),
96 Double.longBitsToDouble(0xfff4000000000000L),
97 Double.longBitsToDouble(0xfff8000000000000L),
98 Double.longBitsToDouble(0xffffffffffffffffL)
99 };
100 for (int i = 0; i < dvals.length; i++) {
101 expectTrue(isNaN64(dvals[i]));
102 }
103
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100104 System.out.println("TestIsNan passed");
Aart Bik75a38b22016-02-17 10:41:50 -0800105 }
106
107 private static void expectTrue(boolean value) {
108 if (!value) {
109 throw new Error("Expected True");
110 }
111 }
112
113 private static void expectFalse(boolean value) {
114 if (value) {
115 throw new Error("Expected False");
116 }
117 }
118}