MST

星途 面试题库

面试题:Rust中浮点数运算误差的常见场景及控制方法

在Rust中,列举至少两个浮点数运算可能产生误差的常见场景,并说明如何使用标准库提供的方法来控制这些误差。
29.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

常见场景

  1. 小数精度问题:由于浮点数在计算机中采用二进制表示,许多十进制小数无法精确转换为二进制小数,例如 0.1 在二进制中是无限循环小数。在进行连续的浮点数加法运算时,误差可能累积。例如:
let mut sum = 0.0;
for _ in 0..10 {
    sum += 0.1;
}
println!("sum: {}", sum); 
// 输出可能不是1.0,而是接近1.0的一个值,如0.9999999999999999
  1. 比较运算:因为浮点数存在精度误差,直接使用 == 进行比较可能会得到意外结果。例如:
let a = 0.1 + 0.2;
let b = 0.3;
println!("a == b: {}", a == b); 
// 由于精度问题,可能输出false

控制误差的方法

  1. 使用 approxapprox 库提供了更适合浮点数比较的方法。首先在 Cargo.toml 中添加依赖:
[dependencies]
approx = "0.4"

然后在代码中使用:

use approx::assert_relative_eq;

let a = 0.1 + 0.2;
let b = 0.3;
assert_relative_eq!(a, b); 
  1. 设置误差范围:在手动比较时,设定一个可接受的误差范围。例如:
let a = 0.1 + 0.2;
let b = 0.3;
let epsilon = 1e-6;
if (a - b).abs() < epsilon {
    println!("a and b are approximately equal");
}
  1. 使用 round 方法:对于一些运算结果,可以通过 round 方法进行舍入来控制误差。例如:
let num = 0.1 + 0.2;
let rounded = num.round();
println!("rounded: {}", rounded);