此代码:
use std::usize;
fn main() {
fn main() {
let a = usize::MAX;
println!("{:?}", a );
println!("{:?}", a as f64 );
}
返回
18446744073709551615
18446744073709552000
了解这种精度损失的最佳方法是什么?
答案 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