执行此代码(Playground):
class Restaurant {
...
public: void processPayment(int orderNumber) {
auto order = allOrders.find(orderNumber);
if (order == std::end(allOrders)) { throw std::invalid_argument(); }
order->second.pay();
}
...
};
...打印:
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::MAX
是一个整数(无小数部分)。实际上,Wikipedia agrees具有最大值,并且说f32::MAX
为(2 − 2 −23 )×2 127 ,略小于2 128 。鉴于此,我认为f32::MAX
可以精确地表示为f32::MAX
。但是正如您所看到的,通过u128
进行强制转换将提供完全不同的值。
为什么强制转换的结果与原始值不同?
(我知道漂浮物是非常奇怪的野兽,但是我希望这个问题的答案比“漂浮物是奇怪的家伙”包含更多的信息)
答案 0 :(得分: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