@@ -56,6 +56,14 @@ impl FloatToInt<u64> for f64 {
56
56
fn cast ( self ) -> u64 { self as _ }
57
57
unsafe fn cast_unchecked ( self ) -> u64 { self . to_int_unchecked ( ) }
58
58
}
59
+ impl FloatToInt < i128 > for f64 {
60
+ fn cast ( self ) -> i128 { self as _ }
61
+ unsafe fn cast_unchecked ( self ) -> i128 { self . to_int_unchecked ( ) }
62
+ }
63
+ impl FloatToInt < u128 > for f64 {
64
+ fn cast ( self ) -> u128 { self as _ }
65
+ unsafe fn cast_unchecked ( self ) -> u128 { self . to_int_unchecked ( ) }
66
+ }
59
67
60
68
/// Test this cast both via `as` and via `approx_unchecked` (i.e., it must not saturate).
61
69
#[ track_caller]
@@ -137,6 +145,7 @@ fn casts() {
137
145
// f32 -> u32
138
146
test_cast :: < f32 , u32 > ( 0.0 , 0 ) ;
139
147
test_cast :: < f32 , u32 > ( -0.0 , 0 ) ;
148
+ test_cast :: < f32 , u32 > ( -0.9999999 , 0 ) ;
140
149
test_cast :: < f32 , u32 > ( /*0x1p-149*/ f32:: from_bits ( 0x1 ) , 0 ) ;
141
150
test_cast :: < f32 , u32 > ( /*-0x1p-149*/ f32:: from_bits ( 0x80000001 ) , 0 ) ;
142
151
test_cast :: < f32 , u32 > ( /*0x1.19999ap+0*/ f32:: from_bits ( 0x3f8ccccd ) , 1 ) ;
@@ -210,6 +219,7 @@ fn casts() {
210
219
// f64 -> u64
211
220
test_cast :: < f64 , u64 > ( 0.0 , 0 ) ;
212
221
test_cast :: < f64 , u64 > ( -0.0 , 0 ) ;
222
+ test_cast :: < f64 , u64 > ( -0.99999999999 , 0 ) ;
213
223
test_cast :: < f64 , u64 > ( 5.0 , 5 ) ;
214
224
test_cast :: < f64 , u64 > ( 1e16 , 10000000000000000 ) ;
215
225
test_cast :: < f64 , u64 > ( ( u64:: MAX -1024 ) as f64 , u64:: MAX -2047 ) ; // rounding loss
@@ -225,6 +235,14 @@ fn casts() {
225
235
assert_eq :: < u64 > ( f64:: NAN as u64 , 0 ) ;
226
236
assert_eq :: < u64 > ( ( -f64:: NAN ) as u64 , 0 ) ;
227
237
238
+ // f64 -> i128
239
+ assert_eq :: < i128 > ( f64:: MAX as i128 , i128:: MAX ) ;
240
+ assert_eq :: < i128 > ( f64:: MIN as i128 , i128:: MIN ) ;
241
+
242
+ // f64 -> u128
243
+ assert_eq :: < u128 > ( f64:: MAX as u128 , u128:: MAX ) ;
244
+ assert_eq :: < u128 > ( f64:: MIN as u128 , 0 ) ;
245
+
228
246
// int -> f32
229
247
assert_eq :: < f32 > ( 127i8 as f32 , 127.0 ) ;
230
248
assert_eq :: < f32 > ( 2147483647i32 as f32 , 2147483648.0 ) ;
@@ -275,10 +293,8 @@ fn casts() {
275
293
assert_eq :: < f32 > ( 5.0f64 as f32 , 5.0f32 ) ;
276
294
assert_eq :: < f32 > ( /*0x0.0000000000001p-1022*/ f64:: from_bits ( 0x1 ) as f32 , 0.0 ) ;
277
295
assert_eq :: < f32 > ( /*-0x0.0000000000001p-1022*/ ( -f64:: from_bits ( 0x1 ) ) as f32 , -0.0 ) ;
278
-
279
296
assert_eq :: < f32 > ( /*0x1.fffffe0000000p-127*/ f64:: from_bits ( 0x380fffffe0000000 ) as f32 , /*0x1p-149*/ f32:: from_bits ( 0x800000 ) ) ;
280
297
assert_eq :: < f32 > ( /*0x1.4eae4f7024c7p+108*/ f64:: from_bits ( 0x46b4eae4f7024c70 ) as f32 , /*0x1.4eae5p+108*/ f32:: from_bits ( 0x75a75728 ) ) ;
281
-
282
298
assert_eq :: < f32 > ( f64:: MAX as f32 , f32:: INFINITY ) ;
283
299
assert_eq :: < f32 > ( f64:: MIN as f32 , f32:: NEG_INFINITY ) ;
284
300
assert_eq :: < f32 > ( f64:: INFINITY as f32 , f32:: INFINITY ) ;
0 commit comments