Rust 检查浮点是否可以转换为整数而不丢失

Rust 检查浮点是否可以转换为整数而不丢失,rust,idioms,Rust,Idioms,我想检查一个整数是否是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

我想检查一个整数是否是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可以有效地检查整数是否是2的幂。count_ones()==1

可以用来检查是否存在非零小数部分:

42.0f64.fract() == 0.0;
42.23f64.fract() != 0.0;
请注意,这仅在您已经知道该数字在范围内时有效。如果需要额外检查以测试浮点数是否介于0和
u32::MAX
之间(或介于
i32::MIN
i32::MAX
之间),则最好执行转换并检查其是否丢失精度:

x == (x as u32) as f64

就在昨天,有一篇关于这件事的帖子。测试
x>0
x&(x-1)=0
。请记住,
x作为u32
可能已经导致精度损失:整数可能是2的幂,但这并不意味着原始浮点是。检查浮点
x
是否可以无损地转换为int
n
涉及分数
x.fract()==0\u f32
/
x==(float)n
和浮点的间距/溢出:
(x+1)!=x
x
。(对javaisms表示抱歉)我的问题是/was:
检查浮点是否可以在不丢失的情况下转换为整数
。两种东西的力量只是我的问题动机。这包括分数。。。关于大于u32::MAX的f64数字呢?
fract()
实际上被实现为
self-self.trunc()
,最好使用
v.trunc()==v
进行检查。@diginoise你是对的,这只适用于已知在范围内的数字。@Jmb:对,我考虑的是分数(例如0.3)这是完全关闭
x==(x为u32)as f64
就是我一直看到的这种构造。