OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 // Don't convert !(a op b) to (a neg-op b) when a or b might be NaN. | 5 // Don't convert !(a op b) to (a neg-op b) when a or b might be NaN. |
6 test(double n) { | 6 test(double n) { |
7 // Force known type to double, preserves NaN. | 7 // Force known type to double, preserves NaN. |
8 n = 0.0 + n; | 8 n = 0.0 + n; |
9 Expect.isFalse(n >= 0); | 9 Expect.isFalse(n >= 0); |
10 Expect.isTrue(!(n < 0)); | 10 Expect.isTrue(!(n < 0)); |
11 | 11 |
12 Expect.isFalse(n <= 0); | 12 Expect.isFalse(n <= 0); |
13 Expect.isTrue(!(n > 0)); | 13 Expect.isTrue(!(n > 0)); |
14 | 14 |
15 Expect.isFalse(n < 0); | 15 Expect.isFalse(n < 0); |
16 Expect.isTrue(!(n >= 0)); | 16 Expect.isTrue(!(n >= 0)); |
17 | 17 |
18 Expect.isFalse(n > 0); | 18 Expect.isFalse(n > 0); |
19 Expect.isTrue(!(n <= 0)); | 19 Expect.isTrue(!(n <= 0)); |
20 | 20 |
21 Expect.isFalse(n == 0); | 21 Expect.isFalse(n == 0); |
22 Expect.isFalse(!(n != 0)); | 22 Expect.isFalse(!(n != 0)); |
23 | 23 |
24 Expect.isTrue(n != 0); | 24 Expect.isTrue(n != 0); |
25 Expect.isTrue(!(n == 0)); | 25 Expect.isTrue(!(n == 0)); |
26 | 26 |
27 Expect.isFalse(n === 0); | 27 Expect.isFalse(identical(n, 0)); |
28 Expect.isFalse(!(n !== 0)); | 28 Expect.isFalse(!(!identical(n, 0))); |
29 | 29 |
30 Expect.isTrue(n !== 0); | 30 Expect.isTrue(!identical(n, 0)); |
31 Expect.isTrue(!(n === 0)); | 31 Expect.isTrue(!(identical(n, 0))); |
32 | 32 |
33 Expect.isFalse(0 >= n); | 33 Expect.isFalse(0 >= n); |
34 Expect.isTrue(!(0 < n)); | 34 Expect.isTrue(!(0 < n)); |
35 | 35 |
36 Expect.isFalse(0 <= n); | 36 Expect.isFalse(0 <= n); |
37 Expect.isTrue(!(0 > n)); | 37 Expect.isTrue(!(0 > n)); |
38 | 38 |
39 Expect.isFalse(0 < n); | 39 Expect.isFalse(0 < n); |
40 Expect.isTrue(!(0 >= n)); | 40 Expect.isTrue(!(0 >= n)); |
41 | 41 |
42 Expect.isFalse(0 > n); | 42 Expect.isFalse(0 > n); |
43 Expect.isTrue(!(0 <= n)); | 43 Expect.isTrue(!(0 <= n)); |
44 | 44 |
45 Expect.isFalse(0 == n); | 45 Expect.isFalse(0 == n); |
46 Expect.isFalse(!(0 != n)); | 46 Expect.isFalse(!(0 != n)); |
47 | 47 |
48 Expect.isTrue(0 != n); | 48 Expect.isTrue(0 != n); |
49 Expect.isTrue(!(0 == n)); | 49 Expect.isTrue(!(0 == n)); |
50 | 50 |
51 Expect.isFalse(0 === n); | 51 Expect.isFalse(identical(0, n)); |
52 Expect.isFalse(!(0 !== n)); | 52 Expect.isFalse(!(!identical(0, n))); |
53 | 53 |
54 Expect.isTrue(0 !== n); | 54 Expect.isTrue(!identical(0, n)); |
55 Expect.isTrue(!(0 === n)); | 55 Expect.isTrue(!(identical(0, n))); |
56 } | 56 } |
57 | 57 |
58 testConstant() { | 58 testConstant() { |
59 Expect.isFalse(double.NAN >= 0); | 59 Expect.isFalse(double.NAN >= 0); |
60 Expect.isTrue(!(double.NAN < 0)); | 60 Expect.isTrue(!(double.NAN < 0)); |
61 | 61 |
62 Expect.isFalse(double.NAN <= 0); | 62 Expect.isFalse(double.NAN <= 0); |
63 Expect.isTrue(!(double.NAN > 0)); | 63 Expect.isTrue(!(double.NAN > 0)); |
64 | 64 |
65 Expect.isFalse(double.NAN < 0); | 65 Expect.isFalse(double.NAN < 0); |
66 Expect.isTrue(!(double.NAN >= 0)); | 66 Expect.isTrue(!(double.NAN >= 0)); |
67 | 67 |
68 Expect.isFalse(double.NAN > 0); | 68 Expect.isFalse(double.NAN > 0); |
69 Expect.isTrue(!(double.NAN <= 0)); | 69 Expect.isTrue(!(double.NAN <= 0)); |
70 | 70 |
71 Expect.isFalse(double.NAN == 0); | 71 Expect.isFalse(double.NAN == 0); |
72 Expect.isFalse(!(double.NAN != 0)); | 72 Expect.isFalse(!(double.NAN != 0)); |
73 | 73 |
74 Expect.isTrue(double.NAN != 0); | 74 Expect.isTrue(double.NAN != 0); |
75 Expect.isTrue(!(double.NAN == 0)); | 75 Expect.isTrue(!(double.NAN == 0)); |
76 | 76 |
77 Expect.isFalse(double.NAN === 0); | 77 Expect.isFalse(identical(double.NAN, 0)); |
78 Expect.isFalse(!(double.NAN !== 0)); | 78 Expect.isFalse(!(!identical(double.NAN, 0))); |
79 | 79 |
80 Expect.isTrue(double.NAN !== 0); | 80 Expect.isTrue(!identical(double.NAN, 0)); |
81 Expect.isTrue(!(double.NAN === 0)); | 81 Expect.isTrue(!(identical(double.NAN, 0))); |
82 | 82 |
83 Expect.isFalse(0 >= double.NAN); | 83 Expect.isFalse(0 >= double.NAN); |
84 Expect.isTrue(!(0 < double.NAN)); | 84 Expect.isTrue(!(0 < double.NAN)); |
85 | 85 |
86 Expect.isFalse(0 <= double.NAN); | 86 Expect.isFalse(0 <= double.NAN); |
87 Expect.isTrue(!(0 > double.NAN)); | 87 Expect.isTrue(!(0 > double.NAN)); |
88 | 88 |
89 Expect.isFalse(0 < double.NAN); | 89 Expect.isFalse(0 < double.NAN); |
90 Expect.isTrue(!(0 >= double.NAN)); | 90 Expect.isTrue(!(0 >= double.NAN)); |
91 | 91 |
92 Expect.isFalse(0 > double.NAN); | 92 Expect.isFalse(0 > double.NAN); |
93 Expect.isTrue(!(0 <= double.NAN)); | 93 Expect.isTrue(!(0 <= double.NAN)); |
94 | 94 |
95 Expect.isFalse(0 == double.NAN); | 95 Expect.isFalse(0 == double.NAN); |
96 Expect.isFalse(!(0 != double.NAN)); | 96 Expect.isFalse(!(0 != double.NAN)); |
97 | 97 |
98 Expect.isTrue(0 != double.NAN); | 98 Expect.isTrue(0 != double.NAN); |
99 Expect.isTrue(!(0 == double.NAN)); | 99 Expect.isTrue(!(0 == double.NAN)); |
100 | 100 |
101 Expect.isFalse(0 === double.NAN); | 101 Expect.isFalse(identical(0, double.NAN)); |
102 Expect.isFalse(!(0 !== double.NAN)); | 102 Expect.isFalse(!(!identical(0, double.NAN))); |
103 | 103 |
104 Expect.isTrue(0 !== double.NAN); | 104 Expect.isTrue(!identical(0, double.NAN)); |
105 Expect.isTrue(!(0 === double.NAN)); | 105 Expect.isTrue(!(identical(0, double.NAN))); |
106 } | 106 } |
107 | 107 |
108 main() { | 108 main() { |
109 test(hideConstant(27, double.NAN)); | 109 test(hideConstant(27, double.NAN)); |
110 testConstant(); | 110 testConstant(); |
111 } | 111 } |
112 | 112 |
113 double hideConstant(int n, double result) { | 113 double hideConstant(int n, double result) { |
114 if (n == 1) return result; | 114 if (n == 1) return result; |
115 if ((n & 1) == 0) return hideConstant(n >> 1, result); | 115 if ((n & 1) == 0) return hideConstant(n >> 1, result); |
116 return hideConstant(3 * n + 1, result); | 116 return hideConstant(3 * n + 1, result); |
117 } | 117 } |
OLD | NEW |