Rust 中的浮点数用于表示带有小数部分的数值,是科学计算和图形处理的基础。Rust 提供了两种主要的浮点类型:f32(单精度)和 f64(双精度),默认使用 f64 以提供更高的精度。

浮点数类型与声明

在 Rust 中,浮点数遵循 IEEE 754 标准,支持正负无穷大、NaN(非数字)等特殊值。声明浮点数变量时,可以使用类型注解或让编译器推断。

let x: f32 = 3.14; // 单精度浮点数
let y = 2.718f64; // 双精度浮点数,使用后缀
println!("x = {}, y = {}", x, y);
// 输出: x = 3.14, y = 2.718

处理特殊值

浮点数可能产生 NaN 或无穷大,这在错误处理中很重要。Rust 提供了方法来检查这些值。

let nan = f64::NAN;
let inf = f64::INFINITY;
println!("is_nan: {}, is_infinite: {}", nan.is_nan(), inf.is_infinite());
// 输出: is_nan: true, is_infinite: true

注意:直接比较 NaN 值会返回 false,应使用 is_nan() 方法。例如,nan == nan 结果为 false。

浮点数比较

由于二进制表示的限制,浮点数可能存在精度误差,任何编程语言都存在这个问题:

fn main() {
    let x = 0.1_f64;
    let y = 0.2_f64;
    let z = x + y;
    
    println!("0.1 + 0.2 = {}", z);
    println!("等于 0.3? {}", z == 0.3);
    // 输出:0.1 + 0.2 = 0.30000000000000004
    // 等于 0.3? false
}

比较浮点数时,应该使用误差范围比较:

fn approx_equal(a: f64, b: f64, epsilon: f64) -> bool {
    (a - b).abs() < epsilon
}

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

性能

f64 通常比 f32 慢,但提供更高精度。在性能关键的应用中,应根据需求选择类型。以下表格对比了两种类型:

类型 精度 内存占用
f32 约 7 位小数 4 字节
f64 约 15 位小数 8 字节