在Rust中将usize转换为f64时,了解精度损失的最佳方法是什么?

时间:2016-03-26 12:37:44

标签: rust

此代码:

use std::usize;

fn main() {
    fn main() {
    let a = usize::MAX;
    println!("{:?}", a );
    println!("{:?}", a as f64 );
}

返回

18446744073709551615
18446744073709552000

了解这种精度损失的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

嗯,64位浮点表示精确到15–17 significant decimal digits,因此您可以根据此估计潜在的不准确性。你可以更喜欢说这样的浮点表示具有x的误差范围,因此该特定的位序列表示{{1}范围内的值} self - x,但这很少是一个有用的概念,你不可能找到很多代码来帮助你。

答案 1 :(得分:4)

conv crate旨在解决这个问题。 ValueFrom / ValueInto特征执行保留值的转换,如果输入值无法在输出类型中准确表示,则会返回错误。例如:

/*!
Add this to your `Cargo.toml`:

```cargo
[dependencies]
conv = "0.3.2"
```
*/
extern crate conv;

use conv::prelude::*;

fn main() {
    let a = std::u32::MAX;
    println!("u32::MAX -> f32: {:?}", a.value_as::<f32>());
    println!("u32::MAX -> f64: {:?}", a.value_as::<f64>());
}

输出:

u32::MAX -> f32: Err(PosOverflow(..))
u32::MAX -> f64: Ok(4294967295)

或者,您可以手动复制检查conv:检查输入整数是否超出浮点类型可以精确表示的整数范围。具体做法是:

  • f32:±16,777,215
  • f64:±9,007,199,254,740,991