2
2
use std:: fmt:: Debug ;
3
3
4
4
// Helper function to avoid promotion so that this tests "run-time" casts, not CTFE.
5
- // Doesn't make a big difference when running this in Miri, but when running this in
6
- // rustc ( with -Zmir-opt-level=0) for comparison it means we use LLVM casts.
5
+ // Doesn't make a big difference when running this in Miri, but it means we can compare this
6
+ // with the LLVM backend by running `rustc -Zmir-opt-level=0 -Zsaturating-float- casts` .
7
7
#[ track_caller]
8
8
#[ inline( never) ]
9
9
fn assert_eq < T : PartialEq + Debug > ( x : T , y : T ) {
@@ -29,7 +29,7 @@ fn main() {
29
29
let y: f32 = unsafe { std:: mem:: transmute ( x) } ;
30
30
assert_eq ( y, 42.0_f32 ) ;
31
31
32
- // f32-to- int casts
32
+ // f32 <-> int casts
33
33
assert_eq ( 5.0f32 as u32 , 5 ) ;
34
34
assert_eq ( -5.0f32 as u32 , 0 ) ;
35
35
assert_eq ( 5.0f32 as i32 , 5 ) ;
@@ -44,11 +44,13 @@ fn main() {
44
44
assert_eq ( std:: f32:: NEG_INFINITY as u32 , 0 ) ;
45
45
assert_eq ( std:: f32:: NAN as i32 , 0 ) ;
46
46
assert_eq ( std:: f32:: NAN as u32 , 0 ) ;
47
- assert_eq ( u128:: MAX as f32 , std:: f32:: INFINITY ) ;
48
47
assert_eq ( ( u32:: MAX -127 ) as f32 as u32 , u32:: MAX ) ; // rounding loss
49
48
assert_eq ( ( u32:: MAX -128 ) as f32 as u32 , u32:: MAX -255 ) ; // rounding loss
49
+ assert_eq ( 127i8 as f32 , 127.0f32 ) ;
50
+ assert_eq ( i128:: MIN as f32 , -170141183460469231731687303715884105728.0f32 ) ;
51
+ assert_eq ( u128:: MAX as f32 , std:: f32:: INFINITY ) ; // saturation
50
52
51
- // f64-to- int casts
53
+ // f64 <-> int casts
52
54
assert_eq ( 5.0f64 as u64 , 5 ) ;
53
55
assert_eq ( -5.0f64 as u64 , 0 ) ;
54
56
assert_eq ( 5.0f64 as i64 , 5 ) ;
@@ -63,9 +65,11 @@ fn main() {
63
65
assert_eq ( std:: f64:: NEG_INFINITY as u64 , 0 ) ;
64
66
assert_eq ( std:: f64:: NAN as i64 , 0 ) ;
65
67
assert_eq ( std:: f64:: NAN as u64 , 0 ) ;
66
- assert_eq ( u128:: MAX as f64 as u128 , u128:: MAX ) ;
67
68
assert_eq ( ( u64:: MAX -1023 ) as f64 as u64 , u64:: MAX ) ; // rounding loss
68
69
assert_eq ( ( u64:: MAX -1024 ) as f64 as u64 , u64:: MAX -2047 ) ; // rounding loss
70
+ assert_eq ( u128:: MAX as f64 as u128 , u128:: MAX ) ;
71
+ assert_eq ( i16:: MIN as f64 , -32768.0f64 ) ;
72
+ assert_eq ( u128:: MAX as f64 , 340282366920938463463374607431768211455.0f64 ) ; // even that fits...
69
73
70
74
// f32 <-> f64 casts
71
75
assert_eq ( 5.0f64 as f32 , 5.0f32 ) ;
0 commit comments