将`f32 :: MAX`转换为`u128`会产生意外的值

Luk*_*odt 6 casting rust

执行此代码(Playground):

println!("u128 max:    {}", u128::max_value());
println!("f32 max:     {}", std::f32::MAX);
println!("f32 as u128: {}", std::f32::MAX as u128);
Run Code Online (Sandbox Code Playgroud)

...打印:

u128 max:    340282366920938463463374607431768211455
f32 max:     340282350000000000000000000000000000000
f32 as u128: 340282346638528859811704183484516925440
Run Code Online (Sandbox Code Playgroud)

从这个输出来看,我们可以推断出u128::max_value() > f32::MAXf32::MAX是一个整数(没有小数部分).实际上,维基百科同意最大值,并说它f32::MAX是(2 - 2 -23)×2 127,略小于2 128.鉴于此,我认为这f32::MAX完全可以表示为u128.但是正如你所看到的,通过as它投射它会产生完全不同的价值.

为什么演员表的结果与原始值不同?

(我知道漂浮物是非常奇怪的野兽和所有.但我希望这个问题有一个答案,其中包含的信息比"漂浮物很奇怪"还要多)

Mar*_*cus 11

这是由于打印时浮动的格式.默认情况下,格式化程序在打印浮动时仅显示8个有效数字.明确指定格式字符串中的精度将为第2行和第3行产生相同的结果.

println!("u128 max:    {}", u128::max_value());
println!("f32 max:     {:.0}", std::f32::MAX);
println!("f32 as u128: {}", std::f32::MAX as u128);
Run Code Online (Sandbox Code Playgroud)

输出:

u128 max:    340282366920938463463374607431768211455
f32 max:     340282346638528859811704183484516925440
f32 as u128: 340282346638528859811704183484516925440
Run Code Online (Sandbox Code Playgroud)

  • 由于单精度浮点数仅有大约8个显着数字,因此剩余数字通常只是噪声 - 它们不包含任何实际信息,主要来自数字系统之间的转换.因此默认为有效数字对我来说是有意义的,当然,指数数字格式对于浮点数也更有意义. (5认同)