我想检查整数是否为2的幂。我的标准方法是查看log₂(x)
是否为整数值,但我发现没有优雅的方法来执行此操作。我的方法如下:
let x = 65;
let y = (x as f64).log(2.0);
// Compute the difference between y and the result of
// of truncating y by casting to int and back
let difference = y - (y as i64 as f64);
// This looks nice but matches on float values will be phased out
match difference {
0.0 => println!("{} is a power of 2", x),
_ => println!("{} is NO power of 2", x),
}
// This seems kind of clunky
if difference == 0.0 {
println!("{} is a power of 2", x);
} else {
println!("{} is NO power of 2", x);
}
Rust中是否有内置选项来检查浮点数是否可以转换为整数而不截断?
表现得像:
42.0f64.is_int() // True/ Ok()
42.23f64.is_int() // False/ Err()
换句话说,一个方法/宏/等允许我通过强制转换为int来检查我是否会丢失信息(小数)。
我已经发现使用x.count_ones() == 1
可以有效地检查整数是否为2的幂。
答案 0 :(得分:5)
您可以使用fract检查是否存在非零小数部分:
42.0f64.fract() == 0.0;
42.23f64.fract() != 0.0;
请注意,仅当您已知道该数字在范围内时才有效。如果您需要额外检查来测试浮点数是否介于0和u32::MAX
之间(或i32::MIN
和i32::MAX
之间),那么您也可以进行转换并检查它并没有失去精确度:
x == (x as u32) as f64