将`f32 :: MAX`转换为`u128`会导致意外的值

时间:2019-02-04 14:47:06

标签: casting rust

执行此代码(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进行强制转换将提供完全不同的值。

为什么强制转换的结果与原始值不同?

我知道漂浮物是非常奇怪的野兽,但是我希望这个问题的答案比“漂浮物是奇怪的家伙”包含更多的信息

1 个答案:

答案 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