铸造`F32 :: MAX`为'意想不到的价值u128`结果

问题描述 投票:6回答:1

执行此代码(Playground):

println!("u128 max:    {}", u128::max_value());
println!("f32 max:     {}", std::f32::MAX);
println!("f32 as u128: {}", std::f32::MAX as u128);

...打印:

u128 max:    340282366920938463463374607431768211455
f32 max:     340282350000000000000000000000000000000
f32 as u128: 340282346638528859811704183484516925440

从这个输出来看,我们可以推断,u128::max_value() > f32::MAXf32::MAX是一个整数(无小数部分)。事实上,Wikipedia agrees用的最高值,并说f32::MAX是(2 - 2-23)×2127这是略小于2128鉴于这种情况,我会认为f32::MAXu128精确表示。但正如你所看到的,通过as铸造它提供了一个完全不同的价值。

为什么投的结果从原来的值不同?

(我知道花车是非常奇怪的野兽和一切,但我希望有一个回答这个问题包含除“花车奇怪咄”的更多信息)

casting rust
1个回答
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);

输出:

u128 max:    340282366920938463463374607431768211455
f32 max:     340282346638528859811704183484516925440
f32 as u128: 340282346638528859811704183484516925440
© www.soinside.com 2019 - 2024. All rights reserved.