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 字节 |