@@ -11,6 +11,12 @@ fn assert_eq<T: PartialEq + Debug>(x: T, y: T) {
1111}
1212
1313fn main ( ) {
14+ basic ( ) ;
15+ casts ( ) ;
16+ ops ( ) ;
17+ }
18+
19+ fn basic ( ) {
1420 // basic arithmetic
1521 assert_eq ( 6.0_f32 * 6.0_f32 , 36.0_f32 ) ;
1622 assert_eq ( 6.0_f64 * 6.0_f64 , 36.0_f64 ) ;
@@ -41,57 +47,138 @@ fn main() {
4147 let x: u32 = unsafe { std:: mem:: transmute ( 42.0_f32 ) } ;
4248 let y: f32 = unsafe { std:: mem:: transmute ( x) } ;
4349 assert_eq ( y, 42.0_f32 ) ;
50+ }
51+
52+ fn casts ( ) {
53+ // f32 -> i32
54+ assert_eq :: < i32 > ( 0.0f32 as i32 , 0 ) ;
55+ assert_eq :: < i32 > ( -0.0f32 as i32 , 0 ) ;
56+ assert_eq :: < i32 > ( /*0x1p-149*/ f32:: from_bits ( 0x00000001 ) as i32 , 0 ) ;
57+ assert_eq :: < i32 > ( /*-0x1p-149*/ f32:: from_bits ( 0x80000001 ) as i32 , 0 ) ;
58+ assert_eq :: < i32 > ( /*0x1.19999ap+0*/ f32:: from_bits ( 0x3f8ccccd ) as i32 , 1 ) ;
59+ assert_eq :: < i32 > ( /*-0x1.19999ap+0*/ f32:: from_bits ( 0xbf8ccccd ) as i32 , -1 ) ;
60+ assert_eq :: < i32 > ( 1.9f32 as i32 , 1 ) ;
61+ assert_eq :: < i32 > ( -1.9f32 as i32 , -1 ) ;
62+ assert_eq :: < i32 > ( 5.0f32 as i32 , 5 ) ;
63+ assert_eq :: < i32 > ( -5.0f32 as i32 , -5 ) ;
64+ assert_eq :: < i32 > ( 2147483520.0f32 as i32 , 2147483520 ) ;
65+ assert_eq :: < i32 > ( -2147483648.0f32 as i32 , -2147483648 ) ;
66+ // unrepresentable casts
67+ assert_eq :: < i32 > ( 2147483648.0f32 as i32 , i32:: MAX ) ;
68+ assert_eq :: < i32 > ( -2147483904.0f32 as i32 , i32:: MIN ) ;
69+ assert_eq :: < i32 > ( f32:: MAX as i32 , i32:: MAX ) ;
70+ assert_eq :: < i32 > ( f32:: MIN as i32 , i32:: MIN ) ;
71+ assert_eq :: < i32 > ( f32:: INFINITY as i32 , i32:: MAX ) ;
72+ assert_eq :: < i32 > ( f32:: NEG_INFINITY as i32 , i32:: MIN ) ;
73+ assert_eq :: < i32 > ( f32:: NAN as i32 , 0 ) ;
74+ assert_eq :: < i32 > ( ( -f32:: NAN ) as i32 , 0 ) ;
75+
76+ // f32 -> u32
77+ assert_eq :: < u32 > ( 0.0f32 as u32 , 0 ) ;
78+ assert_eq :: < u32 > ( -0.0f32 as u32 , 0 ) ;
79+ assert_eq :: < u32 > ( /*0x1p-149*/ f32:: from_bits ( 0x00000001 ) as u32 , 0 ) ;
80+ assert_eq :: < u32 > ( /*-0x1p-149*/ f32:: from_bits ( 0x80000001 ) as u32 , 0 ) ;
81+ assert_eq :: < u32 > ( /*0x1.19999ap+0*/ f32:: from_bits ( 0x3f8ccccd ) as u32 , 1 ) ;
82+ assert_eq :: < u32 > ( 1.9f32 as u32 , 1 ) ;
83+ assert_eq :: < u32 > ( 5.0f32 as u32 , 5 ) ;
84+ assert_eq :: < u32 > ( 2147483648.0f32 as u32 , 0x8000_0000 ) ;
85+ assert_eq :: < u32 > ( 4294967040.0f32 as u32 , 0u32 . wrapping_sub ( 256 ) ) ;
86+ assert_eq :: < u32 > ( /*-0x1.ccccccp-1*/ f32:: from_bits ( 0xbf666666 ) as u32 , 0 ) ;
87+ assert_eq :: < u32 > ( /*-0x1.fffffep-1*/ f32:: from_bits ( 0xbf7fffff ) as u32 , 0 ) ;
88+ assert_eq :: < u32 > ( ( u32:: MAX -127 ) as f32 as u32 , u32:: MAX ) ; // rounding loss
89+ assert_eq :: < u32 > ( ( u32:: MAX -128 ) as f32 as u32 , u32:: MAX -255 ) ; // rounding loss
90+ // unrepresentable casts
91+ assert_eq :: < u32 > ( 4294967296.0f32 as u32 , u32:: MAX ) ;
92+ assert_eq :: < u32 > ( -5.0f32 as u32 , 0 ) ;
93+ assert_eq :: < u32 > ( f32:: MAX as u32 , u32:: MAX ) ;
94+ assert_eq :: < u32 > ( f32:: MIN as u32 , 0 ) ;
95+ assert_eq :: < u32 > ( f32:: INFINITY as u32 , u32:: MAX ) ;
96+ assert_eq :: < u32 > ( f32:: NEG_INFINITY as u32 , 0 ) ;
97+ assert_eq :: < u32 > ( f32:: NAN as u32 , 0 ) ;
98+ assert_eq :: < u32 > ( ( -f32:: NAN ) as u32 , 0 ) ;
4499
45- // f32 <-> int casts
46- assert_eq ( 5.0f32 as u32 , 5 ) ;
47- assert_eq ( -5.0f32 as u32 , 0 ) ;
48- assert_eq ( 5.0f32 as i32 , 5 ) ;
49- assert_eq ( -5.0f32 as i32 , -5 ) ;
50- assert_eq ( f32:: MAX as i32 , i32:: MAX ) ;
51- assert_eq ( f32:: INFINITY as i32 , i32:: MAX ) ;
52- assert_eq ( f32:: MAX as u32 , u32:: MAX ) ;
53- assert_eq ( f32:: INFINITY as u32 , u32:: MAX ) ;
54- assert_eq ( f32:: MIN as i32 , i32:: MIN ) ;
55- assert_eq ( f32:: NEG_INFINITY as i32 , i32:: MIN ) ;
56- assert_eq ( f32:: MIN as u32 , 0 ) ;
57- assert_eq ( f32:: NEG_INFINITY as u32 , 0 ) ;
58- assert_eq ( f32:: NAN as i32 , 0 ) ;
59- assert_eq ( f32:: NAN as u32 , 0 ) ;
60- assert_eq ( ( u32:: MAX -127 ) as f32 as u32 , u32:: MAX ) ; // rounding loss
61- assert_eq ( ( u32:: MAX -128 ) as f32 as u32 , u32:: MAX -255 ) ; // rounding loss
100+ // f32 -> i64
101+ assert_eq :: < i64 > ( 4294967296.0f32 as i64 , 4294967296 ) ;
102+ assert_eq :: < i64 > ( -4294967296.0f32 as i64 , -4294967296 ) ;
103+ assert_eq :: < i64 > ( 9223371487098961920.0f32 as i64 , 9223371487098961920 ) ;
104+ assert_eq :: < i64 > ( -9223372036854775808.0f32 as i64 , -9223372036854775808 ) ;
105+
106+ // f64 -> i32
107+ assert_eq :: < i32 > ( 0.0f64 as i32 , 0 ) ;
108+ assert_eq :: < i32 > ( -0.0f64 as i32 , 0 ) ;
109+ assert_eq :: < i32 > ( /*0x1.199999999999ap+0*/ f64:: from_bits ( 0x3ff199999999999a ) as i32 , 1 ) ;
110+ assert_eq :: < i32 > ( /*-0x1.199999999999ap+0*/ f64:: from_bits ( 0xbff199999999999a ) as i32 , -1 ) ;
111+ assert_eq :: < i32 > ( 1.9f64 as i32 , 1 ) ;
112+ assert_eq :: < i32 > ( -1.9f64 as i32 , -1 ) ;
113+ assert_eq :: < i32 > ( 1e8f64 as i32 , 100_000_000 ) ;
114+ assert_eq :: < i32 > ( 2147483647.0f64 as i32 , 2147483647 ) ;
115+ assert_eq :: < i32 > ( -2147483648.0f64 as i32 , -2147483648 ) ;
116+ // unrepresentable casts
117+ assert_eq :: < i32 > ( 2147483648.0f64 as i32 , i32:: MAX ) ;
118+ assert_eq :: < i32 > ( -2147483649.0f64 as i32 , i32:: MIN ) ;
119+
120+ // f64 -> i64
121+ assert_eq :: < i64 > ( 0.0f64 as i64 , 0 ) ;
122+ assert_eq :: < i64 > ( -0.0f64 as i64 , 0 ) ;
123+ assert_eq :: < i64 > ( /*0x0.0000000000001p-1022*/ f64:: from_bits ( 0x1 ) as i64 , 0 ) ;
124+ assert_eq :: < i64 > ( /*-0x0.0000000000001p-1022*/ f64:: from_bits ( 0x8000000000000001 ) as i64 , 0 ) ;
125+ assert_eq :: < i64 > ( /*0x1.199999999999ap+0*/ f64:: from_bits ( 0x3ff199999999999a ) as i64 , 1 ) ;
126+ assert_eq :: < i64 > ( /*-0x1.199999999999ap+0*/ f64:: from_bits ( 0xbff199999999999a ) as i64 , -1 ) ;
127+ assert_eq :: < i64 > ( 5.0f64 as i64 , 5 ) ;
128+ assert_eq :: < i64 > ( 5.9f64 as i64 , 5 ) ;
129+ assert_eq :: < i64 > ( -5.0f64 as i64 , -5 ) ;
130+ assert_eq :: < i64 > ( -5.9f64 as i64 , -5 ) ;
131+ assert_eq :: < i64 > ( 4294967296.0f64 as i64 , 4294967296 ) ;
132+ assert_eq :: < i64 > ( -4294967296.0f64 as i64 , -4294967296 ) ;
133+ assert_eq :: < i64 > ( 9223372036854774784.0f64 as i64 , 9223372036854774784 ) ;
134+ assert_eq :: < i64 > ( -9223372036854775808.0f64 as i64 , -9223372036854775808 ) ;
135+ // unrepresentable casts
136+ assert_eq :: < i64 > ( 9223372036854775808.0f64 as i64 , i64:: MAX ) ;
137+ assert_eq :: < i64 > ( -9223372036854777856.0f64 as i64 , i64:: MIN ) ;
138+ assert_eq :: < i64 > ( f64:: MAX as i64 , i64:: MAX ) ;
139+ assert_eq :: < i64 > ( f64:: MIN as i64 , i64:: MIN ) ;
140+ assert_eq :: < i64 > ( f64:: INFINITY as i64 , i64:: MAX ) ;
141+ assert_eq :: < i64 > ( f64:: NEG_INFINITY as i64 , i64:: MIN ) ;
142+ assert_eq :: < i64 > ( f64:: NAN as i64 , 0 ) ;
143+ assert_eq :: < i64 > ( ( -f64:: NAN ) as i64 , 0 ) ;
144+
145+ // f64 -> u64
146+ assert_eq :: < u64 > ( 0.0f64 as u64 , 0 ) ;
147+ assert_eq :: < u64 > ( -0.0f64 as u64 , 0 ) ;
148+ assert_eq :: < u64 > ( 5.0f64 as u64 , 5 ) ;
149+ assert_eq :: < u64 > ( -5.0f64 as u64 , 0 ) ;
150+ assert_eq :: < u64 > ( 1e16f64 as u64 , 10000000000000000 ) ;
151+ assert_eq :: < u64 > ( ( u64:: MAX -1023 ) as f64 as u64 , u64:: MAX ) ; // rounding loss
152+ assert_eq :: < u64 > ( ( u64:: MAX -1024 ) as f64 as u64 , u64:: MAX -2047 ) ; // rounding loss
153+ assert_eq :: < u64 > ( 9223372036854775808.0f64 as u64 , 9223372036854775808 ) ;
154+ // unrepresentable casts
155+ assert_eq :: < u64 > ( 18446744073709551616.0f64 as u64 , u64:: MAX ) ;
156+ assert_eq :: < u64 > ( f64:: MAX as u64 , u64:: MAX ) ;
157+ assert_eq :: < u64 > ( f64:: MIN as u64 , 0 ) ;
158+ assert_eq :: < u64 > ( f64:: INFINITY as u64 , u64:: MAX ) ;
159+ assert_eq :: < u64 > ( f64:: NEG_INFINITY as u64 , 0 ) ;
160+ assert_eq :: < u64 > ( f64:: NAN as u64 , 0 ) ;
161+ assert_eq :: < u64 > ( ( -f64:: NAN ) as u64 , 0 ) ;
162+
163+ // int -> f32
62164 assert_eq ( 127i8 as f32 , 127.0f32 ) ;
63165 assert_eq ( i128:: MIN as f32 , -170141183460469231731687303715884105728.0f32 ) ;
64166 assert_eq ( u128:: MAX as f32 , f32:: INFINITY ) ; // saturation
65167
66- // f64 <-> int casts
67- assert_eq ( 5.0f64 as u64 , 5 ) ;
68- assert_eq ( -5.0f64 as u64 , 0 ) ;
69- assert_eq ( 5.0f64 as i64 , 5 ) ;
70- assert_eq ( -5.0f64 as i64 , -5 ) ;
71- assert_eq ( f64:: MAX as i64 , i64:: MAX ) ;
72- assert_eq ( f64:: INFINITY as i64 , i64:: MAX ) ;
73- assert_eq ( f64:: MAX as u64 , u64:: MAX ) ;
74- assert_eq ( f64:: INFINITY as u64 , u64:: MAX ) ;
75- assert_eq ( f64:: MIN as i64 , i64:: MIN ) ;
76- assert_eq ( f64:: NEG_INFINITY as i64 , i64:: MIN ) ;
77- assert_eq ( f64:: MIN as u64 , 0 ) ;
78- assert_eq ( f64:: NEG_INFINITY as u64 , 0 ) ;
79- assert_eq ( f64:: NAN as i64 , 0 ) ;
80- assert_eq ( f64:: NAN as u64 , 0 ) ;
81- assert_eq ( ( u64:: MAX -1023 ) as f64 as u64 , u64:: MAX ) ; // rounding loss
82- assert_eq ( ( u64:: MAX -1024 ) as f64 as u64 , u64:: MAX -2047 ) ; // rounding loss
83- assert_eq ( u128:: MAX as f64 as u128 , u128:: MAX ) ;
168+ // int -> f64
84169 assert_eq ( i16:: MIN as f64 , -32768.0f64 ) ;
85170 assert_eq ( u128:: MAX as f64 , 340282366920938463463374607431768211455.0f64 ) ; // even that fits...
86171
87- // f32 <-> f64 casts
172+ // f32 <-> f64
88173 assert_eq ( 5.0f64 as f32 , 5.0f32 ) ;
89174 assert_eq ( 5.0f32 as f64 , 5.0f64 ) ;
90175 assert_eq ( f64:: MAX as f32 , f32:: INFINITY ) ;
91176 assert_eq ( f64:: MIN as f32 , f32:: NEG_INFINITY ) ;
92177 assert_eq ( f32:: INFINITY as f64 , f64:: INFINITY ) ;
93178 assert_eq ( f32:: NEG_INFINITY as f64 , f64:: NEG_INFINITY ) ;
179+ }
94180
181+ fn ops ( ) {
95182 // f32 min/max
96183 assert_eq ( ( 1.0 as f32 ) . max ( -1.0 ) , 1.0 ) ;
97184 assert_eq ( ( 1.0 as f32 ) . min ( -1.0 ) , -1.0 ) ;
0 commit comments