直接使用表达式与接收f32的闭包计算为何存在数值差异?
为何两段浮点计算结果存在数值差异?
代码示例
let average = |a: f32, b: f32, c: f32| { (a + b + c) / 3.0 }; println!("With function: {}", average(11.0, -22.0, 33.0)); println!("Without function: {}", (11.0 - 22.0 + 33.0) / 3.0);
运行输出
With function: 7.3333335 Without function: 7.333333333333333
差异原因
这是因为两段代码使用了不同精度的浮点数类型:
- 闭包
average的参数被显式声明为f32(单精度浮点数),整个计算过程基于单精度执行。单精度浮点数仅能提供约7位十进制有效数字的精度,无法精确表示22/3这样的无限循环小数,最终存储的近似值为7.3333335。 - 第二行的直接计算中,所有浮点字面量(
11.0、-22.0等)在Rust里默认是f64(双精度浮点数)。双精度拥有约15-17位十进制有效数字的精度,能更精准地逼近22/3的真实值,因此输出结果为7.333333333333333。
如果要让两者结果一致,要么把闭包的参数类型改为f64,要么给直接计算里的字面量加上f32后缀(比如11.0f32),统一浮点数精度即可。
内容的提问来源于stack exchange,提问作者CocDap
相关产品推荐
相关产品推荐

