最近再看Rust入门,这门语言还是很有意思的,十分重视数值类型,而且很多计算机底层的东西也确实讲的很细,好评。
今天斗胆来给大家分享个题目
有没有大神小伙伴能够,人脑编译出来结果呢?
fn main() {
let abc: (f32, f32, f32) = (0.1, 0.2, 0.3);
let xyz: (f64, f64, f64) = (0.1, 0.2, 0.3);
println!("abc (f32)");
println!(" 0.1 + 0.2: {:x}", (abc.0 + abc.1).to_bits());
println!(" 0.3: {:x}", (abc.2).to_bits());
println!();
println!("xyz (f64)");
println!(" 0.1 + 0.2: {:x}", (xyz.0 + xyz.1).to_bits());
println!(" 0.3: {:x}", (xyz.2).to_bits());
println!();
assert!(abc.0 + abc.1 == abc.2);
assert!(xyz.0 + xyz.1 == xyz.2);
}
鉴于这个题目初看怪怪的,补充一点点进制的知识
计算机都是0和1,所以我们所有的十进制浮点数都会以二进制存储到设备中,那么对于小数尤其是不能够被二进制完美保存的小数,位数就会决定其精度。
所以像是2^-1,2^-2.......2^-100这类的在使用IEEE-754都是很好表述的,所以这个题目就和进制的精度有关哟~
关于这个进制转换的可以参考如下的网址方便计算:
http://weitz.de/ieee/
那么大家也来算算看,看看上面代码返回究竟是什么呢?
|