From a6708bf4b7c0732e192afdf80e08c796775aba66 Mon Sep 17 00:00:00 2001 From: sakex Date: Fri, 9 Oct 2020 01:02:47 +0200 Subject: [PATCH 1/2] Add 1.45.0 cast documentation --- src/types/cast.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/types/cast.md b/src/types/cast.md index 7d990976a3..16e4521868 100644 --- a/src/types/cast.md +++ b/src/types/cast.md @@ -59,5 +59,25 @@ fn main() { println!("1000 as a u8 is : {}", 1000 as u8); // and the two's complement of 232 is -24 println!(" 232 as a i8 is : {}", 232 as i8); + + // Since Rust 1.45, the `as` keyword performs a *saturating cast* when casting from float to int. + // If the floating point value exceeds the upper bound or is less than the lower bound, the returned value will be equal to the bound crossed. + + // 300.0 is 255 + println!("300.0 is {}", 300.0_f32 as u8); + // -100.0 as u8 is 0 + println!("-100.0 as u8 is {}", -100.0_f32 as u8); + // nan as u8 is 0 + println!("nan as u8 is {}", f32::NAN as u8); + + // This behavior incures a small runtime cost and can be avoided with unsafe methods: + unsafe { + // 300.0 is 44 + println!("300.0 is {}", 300.0_f32.to_int_unchecked::()); + // -100.0 as u8 is 156 + println!("-100.0 as u8 is {}", (-100.0_f32).to_int_unchecked::()); + // nan as u8 is 0 + println!("nan as u8 is {}", f32::NAN.to_int_unchecked::()); + } } ``` From 13317575a3ae9ae5605cfff7c134e7ed596426ce Mon Sep 17 00:00:00 2001 From: sakex Date: Fri, 9 Oct 2020 01:07:45 +0200 Subject: [PATCH 2/2] Add warning for unsafe methods --- src/types/cast.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/cast.md b/src/types/cast.md index 16e4521868..2ca18c1784 100644 --- a/src/types/cast.md +++ b/src/types/cast.md @@ -70,7 +70,7 @@ fn main() { // nan as u8 is 0 println!("nan as u8 is {}", f32::NAN as u8); - // This behavior incures a small runtime cost and can be avoided with unsafe methods: + // This behavior incures a small runtime cost and can be avoided with unsafe methods, however the results might overflow and return **unsound values**. Use these methods wisely: unsafe { // 300.0 is 44 println!("300.0 is {}", 300.0_f32.to_int_unchecked::());