7 个版本 (1 个稳定版)
1.0.0 | 2022年12月11日 |
---|---|
0.1.5 | 2020年4月13日 |
#110 在 算法
269,095 每月下载量
在 369 个crate中使用 (直接使用14个)
17KB
225 行
float-next-after
这是一个原生 Rust 的 next after float 函数,它作为特质为 f32 和 f64 类型提供。它向下一个可表示的浮点数前进,即使它是非规格化的。如果不需要非规格化,用户应自行处理这种情况。有关版本化变更日志,请参阅 CHANGES.md
。
对于特定的边缘情况,已经做出了以下决策
- self == y -> 返回 y
- self >= 正无穷大 -> 返回正无穷大
- self <= 负无穷大 -> 返回负无穷大
- self 或 y == NaN -> 返回 NaN
- self = -0.0 且 y = 0.0 -> 返回正 0.0
- self == -0.0 且 y == 正无穷大 -> 5e-324
请参阅单元测试,了解在其他各种异常情况下的实际行为。
此代码使用 f32 和 f64 的 ToBits 和 FromBits 函数。这两个函数只是将 f32/f64 转换为 u32/u64。然而,这些函数的文档声称它们是安全的,并且“关于 sNaN 的安全问题被夸大了!”
欢迎提出 PR 和其他有价值的反馈。
使用方法
use float_next_after::NextAfter;
// Large numbers
let big_num = 16237485966.00000437586943_f64;
let next = big_num.next_after(std::f64::INFINITY);
assert_eq!(next, 16237485966.000006_f64);
// Expected handling of 1.0
let one = 1_f64;
let next = one.next_after(std::f64::INFINITY);
assert_eq!(next, 1_f64 + std::f64::EPSILON);
// Tiny (negative) numbers
let zero = 0_f32;
let next = zero.next_after(std::f32::NEG_INFINITY);
assert_eq!(next, -0.000000000000000000000000000000000000000000001_f32);
// Equal source/dest (even -0 == 0)
let zero = 0_f64;
let next = zero.next_after(-0_f64);
assert_eq!(next, -0_f64);