Rust编程中的浮点数比较

缘由:在看Rust编写的代码,发现了一行浮点数等于比较的代码,于是编辑如下内容。

在Rust中,进行浮点数比较时需要特别小心,因为浮点数由于精度限制无法精确表示小数,可能会导致直接比较(如 ==)的结果不符合预期。这里是一些注意事项和常见的解决方案:

1. 避免直接使用 ==!= 比较

浮点数运算中的精度误差,可能导致直接比较不准确。例如:

rust 复制代码
let a = 0.1 + 0.2;
let b = 0.3;
println!("{}", a == b); // 输出: false

虽然理论上 ab 应该相等,但计算误差会让它们的值稍有不同。因此,避免使用 ==!= 直接比较浮点数。

2. 使用允许误差(误差容限)进行比较

通常,在比较浮点数时引入一个允许的误差范围(即误差容限)。例如,如果两个浮点数的差异在某个很小的范围内,就可以认为它们相等。

rust 复制代码
fn approx_equal(a: f64, b: f64, epsilon: f64) -> bool {
    (a - b).abs() < epsilon
}

fn main() {
    let a = 0.1 + 0.2;
    let b = 0.3;
    println!("{}", approx_equal(a, b, 1e-10)); // 输出: true
}

这里 epsilon 是误差容限,根据实际情况选择合适的值,比如 1e-10 或更小的值。

3. 使用 f64::EPSILONf32::EPSILON

Rust 提供了 f64::EPSILONf32::EPSILON,表示浮点数计算中能表示的最小差值。通常 EPSILON 可以作为误差容限的基础,不过更常见的是在其基础上进行放大:

rust 复制代码
fn approx_equal(a: f64, b: f64) -> bool {
    (a - b).abs() < f64::EPSILON * 10.0 // 放大 epsilon 以确保误差范围足够
}

4. 使用内置的 f64::total_cmp

如果需要对浮点数进行排序,可以使用 total_cmp 方法。这个方法会考虑特殊的浮点数情况,比如 NaN-0.0,避免精度误差对排序结果的影响:

rust 复制代码
fn main() {
    let mut values = vec![0.1 + 0.2, 0.3];
    values.sort_by(|a, b| a.total_cmp(b));
    println!("{:?}", values);
}

5. 尽量避免不必要的浮点计算

尽量避免将多个浮点计算组合在一起,特别是涉及较小或较大的数。浮点数计算误差是累积的,因此计算越复杂,误差越明显。

6. 避免与 NaN 进行比较

任何浮点数与 NaN(非数)进行比较都会返回 false。如果可能存在 NaN 值,应提前检查和处理。

rust 复制代码
let x = f64::NAN;
if x.is_nan() {
    println!("x is NaN");
}

总结

浮点数的精度误差是比较时的一大挑战。在 Rust 中进行浮点数比较时,应尽量避免直接比较,使用误差容限或 total_cmp 方法。

相关推荐
一直C17 分钟前
【Linux应用编程】深入理解Linux多任务机制:进程原理、状态转换与进程控制实战
linux·开发语言·算法·ubuntu·vim·visual studio code
名字还没想好☜27 分钟前
Python asyncio.Queue 实战:用生产者-消费者给爬虫/任务流限速又解耦
开发语言·爬虫·python·并发·asyncio
问君能有几多愁~1 小时前
Qt Json 序列化操作
开发语言·qt·json
xieliyu.1 小时前
MySQL 进阶笔记:用户 / 会话 / 全局 / 局部变量 + CASE 分支语法
开发语言·数据库·笔记·mysql
格林威2 小时前
C#高位深相机图像保存:12位16位图像保存方案,OpenCvSharp和Halcon实现
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
小小龙学IT2 小时前
Qt Graphics View Framework(图形视图框架)深度解析:从 Scene/View/Item 到工业级 2D 场景
开发语言·数据库·qt
2601_966949652 小时前
Python 量化数据质量校验:如何确保股票历史日线数据不存在缺失交易日?
开发语言·人工智能·爬虫·python·量化策略·量化·quantdash
广东帝工智能安防2 小时前
BCAS桥梁防撞预警系统五层架构深度解析:从感知层到对接层的技术实现与选型指南
开发语言·人工智能·架构·边缘计算·桥梁防撞预警系统
树码小子2 小时前
Skill的格式 & 开发语言和工具
开发语言·skill
Java后端的Ai之路2 小时前
05、Python单例模式完全指南
开发语言·人工智能·python·单例模式·oracle