|
1 |
| -#![feature(const_option, core_intrinsics)] |
2 |
| - |
3 | 1 | fn main() {
|
4 |
| - /*test_float!(f64, f64, f64::INFINITY, f64::NEG_INFINITY, f64::NAN); |
5 |
| - ($modname: ident, $fty: ty, $inf: expr, $neginf: expr, $nan: expr) => {*/ |
6 |
| - |
7 |
| - /*assert_eq!((0.0 as f64).min(0.0), 0.0); |
8 |
| - assert!((0.0 as f64).min(0.0).is_sign_positive()); |
9 |
| - assert_eq!((-0.0 as f64).min(-0.0), -0.0); |
10 |
| -
|
11 |
| - fn is_sign_neg(num: f64) -> bool { |
12 |
| - num.to_bits() & 0x8000_0000_0000_0000 != 0 |
13 |
| - } |
14 |
| - //assert!(is_sign_neg(-0.0_f64)); |
15 |
| - println!("{:b}", (-0.0_f64).to_bits()); |
16 |
| - let var = 1.2_f64; |
17 |
| - println!("{}", 1.2_f64 == var);*/ |
18 |
| - |
19 |
| - /*fn my_float() -> f64 { |
20 |
| - -0.0 |
21 |
| - } |
22 |
| -
|
23 |
| - let float = my_float();*/ |
24 |
| - //println!("{}", (-0.0_f64).to_bits()); |
25 |
| - |
26 |
| - // FIXME: seems like the asm is calling comisd which seems to convert -0.0 to 0. |
27 |
| - /*assert!((-0.0_f64).to_bits() & 0x8000_0000_0000_0000 != 0); |
28 |
| - println!("1");*/ |
29 |
| - //println!("{}", float); |
30 |
| - //std::process::exit(float as i32) |
31 |
| - |
32 |
| - /*assert!((-0.0 as f64).min(-0.0).is_sign_negative()); |
33 |
| - assert_eq!((9.0 as f64).min(9.0), 9.0); |
34 |
| - assert_eq!((-9.0 as f64).min(0.0), -9.0); |
35 |
| - assert_eq!((0.0 as f64).min(9.0), 0.0); |
36 |
| - assert!((0.0 as f64).min(9.0).is_sign_positive()); |
37 |
| - assert_eq!((-0.0 as f64).min(9.0), -0.0); |
38 |
| - assert!((-0.0 as f64).min(9.0).is_sign_negative());*/ |
39 |
| - |
40 |
| - //println!("{}", 9); |
41 |
| - //println!("{}", 9.0_f32); |
42 |
| - //assert_eq!(-9.0_f32, -9 as f32); |
43 |
| - |
44 |
| - //assert_eq!("1", format!("{:.0}", 1.0f64)); |
45 |
| - //assert_eq!("9", format!("{:.0}", 9.4f64)); |
46 |
| - //assert_eq!("10", format!("{:.0}", 9.9f64)); |
47 |
| - //assert_eq!("9.8", format!("{:.1}", 9.849f64)); |
48 |
| - //assert_eq!("9.9", format!("{:.1}", 9.851f64)); |
49 |
| - //assert_eq!("1", format!("{:.0}", 0.5f64)); |
50 |
| - |
51 |
| - //assert_eq!(2.3f32.copysign(-1.0), -2.3f32); |
52 |
| - /*let f = 9.4f32; |
53 |
| - println!("{}", f);*/ |
54 |
| - //println!("{}", 9.4f32); // FIXME: this is using bytes_in_context(), but gives a wrong value. |
55 |
| - |
56 |
| - /*extern { |
57 |
| - //pub fn printf(format: *const i8, ...) -> i32; |
58 |
| - pub fn printf(format: *const i8, arg: f64) -> i32; |
59 |
| - } |
60 |
| -
|
61 |
| - unsafe { |
62 |
| - printf(b"Num: %f\n\0" as *const _ as *const _, 9.4f64); |
63 |
| - } |
64 |
| - println!("{}", 9.4f64);*/ |
65 |
| - |
66 |
| - // FIXME: the code seems to be the same when using an integer, but somehow, it doesn't work for |
67 |
| - // a float. Could it be related to the fact that floating-points use different registers? |
68 |
| - |
69 |
| - /*let f = 1234567.89f64; |
70 |
| - assert_eq!("1.23456789e6", format!("{:e}", f)); |
71 |
| - println!("{:e}", f); |
72 |
| - println!("{:e}", 1234567.89f64);*/ |
73 |
| - //assert_eq!("1.23456789e6", format!("{:e}", 1234567.89f64)); |
74 |
| - /*assert_eq!("1.23456789e3", format!("{:e}", 1234.56789f64)); |
75 |
| - assert_eq!("1.23456789E6", format!("{:E}", 1234567.89f64)); |
76 |
| - assert_eq!("1.23456789E3", format!("{:E}", 1234.56789f64)); |
77 |
| - assert_eq!("0.0", format!("{:?}", 0.0f64)); |
78 |
| - assert_eq!("1.01", format!("{:?}", 1.01f64));*/ |
79 |
| - |
80 |
| - /*assert_eq!((-0.0 as f64).min(-9.0), -9.0); |
81 |
| - assert_eq!((f64::INFINITY as f64).min(9.0), 9.0); |
82 |
| - assert_eq!((9.0 as f64).min(f64::INFINITY), 9.0); |
83 |
| - assert_eq!((f64::INFINITY as f64).min(-9.0), -9.0); |
84 |
| - assert_eq!((-9.0 as f64).min(f64::INFINITY), -9.0); |
85 |
| - assert_eq!((f64::NEG_INFINITY as f64).min(9.0), f64::NEG_INFINITY); |
86 |
| - assert_eq!((9.0 as f64).min(f64::NEG_INFINITY), f64::NEG_INFINITY); |
87 |
| - assert_eq!((f64::NEG_INFINITY as f64).min(-9.0), f64::NEG_INFINITY); |
88 |
| - assert_eq!((-9.0 as f64).min(f64::NEG_INFINITY), f64::NEG_INFINITY);*/ |
89 |
| - // Cranelift fmin has NaN propagation |
90 |
| - //assert_eq!((f64::NAN as f64).min(9.0), 9.0); |
91 |
| - //assert_eq!((f64::NAN as f64).min(-9.0), -9.0); |
92 |
| - //assert_eq!((9.0 as f64).min(f64::NAN), 9.0); |
93 |
| - //assert_eq!((-9.0 as f64).min(f64::NAN), -9.0); |
94 |
| - //assert!((f64::NAN as f64).min(f64::NAN).is_nan()); |
95 |
| - |
96 |
| - /*let max: f64 = f32::MAX.into(); |
97 |
| - assert_eq!(max as f32, f32::MAX); |
98 |
| - assert!(max.is_normal()); |
99 |
| -
|
100 |
| - let min: f64 = f32::MIN.into(); |
101 |
| - assert_eq!(min as f32, f32::MIN); |
102 |
| - assert!(min.is_normal()); |
103 |
| -
|
104 |
| - let min_positive: f64 = f32::MIN_POSITIVE.into(); |
105 |
| - assert_eq!(min_positive as f32, f32::MIN_POSITIVE); |
106 |
| - assert!(min_positive.is_normal()); |
107 |
| -
|
108 |
| - let epsilon: f64 = f32::EPSILON.into(); |
109 |
| - assert_eq!(epsilon as f32, f32::EPSILON); |
110 |
| - assert!(epsilon.is_normal()); |
111 |
| -
|
112 |
| - let zero: f64 = (0.0f32).into(); |
113 |
| - assert_eq!(zero as f32, 0.0f32); |
114 |
| - assert!(zero.is_sign_positive()); |
115 |
| -
|
116 |
| - let neg_zero: f64 = (-0.0f32).into(); |
117 |
| - assert_eq!(neg_zero as f32, -0.0f32); |
118 |
| - assert!(neg_zero.is_sign_negative()); |
119 |
| -
|
120 |
| - let infinity: f64 = f32::INFINITY.into(); |
121 |
| - assert_eq!(infinity as f32, f32::INFINITY); |
122 |
| - assert!(infinity.is_infinite()); |
123 |
| - assert!(infinity.is_sign_positive()); |
124 |
| -
|
125 |
| - let neg_infinity: f64 = f32::NEG_INFINITY.into(); |
126 |
| - assert_eq!(neg_infinity as f32, f32::NEG_INFINITY); |
127 |
| - assert!(neg_infinity.is_infinite()); |
128 |
| - assert!(neg_infinity.is_sign_negative()); |
129 |
| -
|
130 |
| - let nan: f64 = f32::NAN.into(); |
131 |
| - assert!(nan.is_nan());*/ |
132 |
| - |
133 |
| - /*use std::convert::TryFrom; |
134 |
| -
|
135 |
| - /*let max = <i128>::MAX; |
136 |
| - let min = <i128>::MIN;*/ |
137 |
| - let zero: i128 = 0; |
138 |
| - /*let t_max = <u64>::MAX; |
139 |
| - let t_min = <u64>::MIN; |
140 |
| - assert!(<u64 as TryFrom<i128>>::try_from(max).is_err()); |
141 |
| - assert!(<u64 as TryFrom<i128>>::try_from(min).is_err());*/ |
142 |
| - println!("{:?}", i128_to_u64(zero)); |
143 |
| - assert_eq!(<u64 as TryFrom<i128>>::try_from(zero).unwrap(), zero as u64); |
144 |
| - /*assert_eq!( |
145 |
| - <u64 as TryFrom<i128>>::try_from(t_max as i128).unwrap(), |
146 |
| - t_max as u64 |
147 |
| - ); |
148 |
| - assert_eq!( |
149 |
| - <u64 as TryFrom<i128>>::try_from(t_min as i128).unwrap(), |
150 |
| - t_min as u64 |
151 |
| - );*/ |
152 |
| - */ |
153 |
| - |
154 |
| - /* |
155 |
| - //let mut num = u128::MAX >> 20; |
156 |
| - //let mut num = u128::MAX; |
157 |
| - #[inline(never)] |
158 |
| - fn two() -> u128 { |
159 |
| - 2 |
160 |
| - } |
161 |
| -
|
162 |
| - //let mut num = 340282366920938463463374607431768211455_u128 >> two(); |
163 |
| - let mut num = 340282366920938463463374607431768211455_u128 >> 2; |
164 |
| - //let mut num = 340282366920938463463374607431768211455_u128; |
165 |
| - //let mut num = 10_u128 >> 2; |
166 |
| - const MASK: u128 = 0x80000000000000000000000000000000; |
167 |
| - for _ in 0..128 { |
168 |
| - if num & MASK == MASK { |
169 |
| - print!("1"); |
170 |
| - } |
171 |
| - else { |
172 |
| - print!("0"); |
173 |
| - } |
174 |
| - num <<= 1; |
175 |
| - } |
176 |
| - println!(); |
177 |
| -*/ |
178 |
| - |
179 |
| - /*let mut r = 2 as i128; |
180 |
| - assert_eq!(r.pow(2), 4 as i128); |
181 |
| - assert_eq!(r.pow(0), 1 as i128); |
182 |
| - assert_eq!(r.wrapping_pow(2), 4 as i128); |
183 |
| - assert_eq!(r.wrapping_pow(0), 1 as i128); |
184 |
| - assert_eq!(r.checked_pow(2), Some(4 as i128)); |
185 |
| - assert_eq!(r.checked_pow(0), Some(1 as i128)); |
186 |
| - assert_eq!(r.overflowing_pow(2), (4 as i128, false)); |
187 |
| - assert_eq!(r.overflowing_pow(0), (1 as i128, false)); |
188 |
| - assert_eq!(r.saturating_pow(2), 4 as i128); |
189 |
| - assert_eq!(r.saturating_pow(0), 1 as i128); |
190 |
| -
|
191 |
| - r = i128::MAX; |
192 |
| - // use `^` to represent .pow() with no overflow. |
193 |
| - // if itest::MAX == 2^j-1, then itest is a `j` bit int, |
194 |
| - // so that `itest::MAX*itest::MAX == 2^(2*j)-2^(j+1)+1`, |
195 |
| - // thussaturating_pow the overflowing result is exactly 1. |
196 |
| - assert_eq!(r.wrapping_pow(2), 1 as i128); |
197 |
| - assert_eq!(r.checked_pow(2), None); |
198 |
| - assert_eq!(r.overflowing_pow(2), (1 as i128, true)); |
199 |
| - assert_eq!(r.saturating_pow(2), i128::MAX); |
200 |
| - //test for negative exponent. |
201 |
| - r = -2 as i128; |
202 |
| - assert_eq!(r.pow(2), 4 as i128); |
203 |
| - assert_eq!(r.pow(3), -8 as i128); |
204 |
| - assert_eq!(r.pow(0), 1 as i128); |
205 |
| - assert_eq!(r.wrapping_pow(2), 4 as i128); |
206 |
| - assert_eq!(r.wrapping_pow(3), -8 as i128); |
207 |
| - assert_eq!(r.wrapping_pow(0), 1 as i128); |
208 |
| - assert_eq!(r.checked_pow(2), Some(4 as i128)); |
209 |
| - assert_eq!(r.checked_pow(3), Some(-8 as i128)); |
210 |
| - assert_eq!(r.checked_pow(0), Some(1 as i128)); |
211 |
| - assert_eq!(r.overflowing_pow(2), (4 as i128, false)); |
212 |
| - assert_eq!(r.overflowing_pow(3), (-8 as i128, false)); |
213 |
| - assert_eq!(r.overflowing_pow(0), (1 as i128, false)); |
214 |
| - assert_eq!(r.saturating_pow(2), 4 as i128); |
215 |
| - assert_eq!(r.saturating_pow(3), -8 as i128); |
216 |
| - assert_eq!(r.saturating_pow(0), 1 as i128);*/ |
217 |
| - |
218 |
| - fn max64() -> i128 { |
219 |
| - 18446744073709551615_i128 |
220 |
| - //18446744073709551615_u64 as i128 |
221 |
| - |
222 |
| - /*println!("{}", u64::MAX); |
223 |
| - u64::MAX as i128*/ |
224 |
| - } |
225 |
| - |
226 |
| - println!("1. {}", max64()); |
| 2 | + const OPTION: Option<usize> = Some(32); |
227 | 3 |
|
228 |
| - /*use std::convert::TryFrom; |
| 4 | + const REF: Option<&usize> = OPTION.as_ref(); |
| 5 | + assert_eq!(REF, Some(&32)); |
229 | 6 |
|
230 |
| - fn try_from(u: i128) -> Option<u64> { |
231 |
| - let min = u64::MIN as i128; |
232 |
| - let max = u64::MAX as i128; |
233 |
| - /*println!("{} < {} == {}", u, min, u < min); |
234 |
| - println!("{} > {} == {}", u, max, u > max);*/ |
235 |
| - if u < min || u > max { |
236 |
| - None |
237 |
| - } else { |
238 |
| - Some(u as u64) |
239 |
| - } |
240 |
| - } |
| 7 | + const IS_SOME: bool = OPTION.is_some(); |
| 8 | + assert!(IS_SOME); |
241 | 9 |
|
242 |
| - let max = <i128>::MAX; |
243 |
| - let min = <i128>::MIN; |
244 |
| - let zero: i128 = 0; |
245 |
| - let t_max = <u64>::MAX; |
246 |
| - let t_min = <u64>::MIN; |
247 |
| - assert!(<u64 as TryFrom<i128>>::try_from(max).is_err()); |
248 |
| - assert!(<u64 as TryFrom<i128>>::try_from(min).is_err()); |
249 |
| - println!("{:?}", try_from(zero)); |
250 |
| - println!("{:?}", <u64 as TryFrom<i128>>::try_from(zero)); |
251 |
| - assert_eq!(<u64 as TryFrom<i128>>::try_from(zero).unwrap(), zero as u64); |
252 |
| - assert_eq!( |
253 |
| - <u64 as TryFrom<i128>>::try_from(t_max as i128).unwrap(), |
254 |
| - t_max as u64 |
255 |
| - ); |
256 |
| - assert_eq!( |
257 |
| - <u64 as TryFrom<i128>>::try_from(t_min as i128).unwrap(), |
258 |
| - t_min as u64 |
259 |
| - );*/ |
| 10 | + const IS_NONE: bool = OPTION.is_none(); |
| 11 | + assert!(!IS_NONE); |
260 | 12 | }
|
0 commit comments