#浮点数 #包装器 #不变性 #浮点 #操作 #检查 #特质

checked-float

一个用于创建强制不变性浮点数包装器的 crate

6 个版本

0.1.5 2023 年 11 月 23 日
0.1.4 2023 年 2 月 16 日
0.1.2 2023 年 1 月 24 日
0.1.1 2022 年 12 月 2 日
0.1.0 2022 年 11 月 26 日

#709 in Rust 模式


用于 netsblox-vm

MIT/Apache 许可

14KB
195

一个与 no-std 兼容的 crate,它提供了对浮点类型的任意不变性进行封装的包装器。可以在类型上实现 FloatChecker 特质,以创建一个不变性检查器,然后可以在 CheckedFloat 类型中使用它来创建一个对所有操作强制执行不变性的包装器。

示例

以下是一个如何使用 checked-float 创建禁止 NaN 的浮点数包装器的示例。

# use checked_float::*;
#[derive(Debug)]
struct NanError;

struct NoNanChecker;
impl<T: Float> FloatChecker<T> for NoNanChecker {
    type Error = NanError;
    fn check(value: T) -> Result<T, Self::Error> {
        if value.is_nan() { Err(NanError) } else { Ok(value) }
    }
}

type NoNan64 = CheckedFloat<f64, NoNanChecker>; // our checked float wrapper

let y = NoNan64::new(0.0).unwrap(); // not nan, so we can unwrap
let x = NoNan64::new(2.0).unwrap(); // not nan, so we can unwrap
assert_eq!(x.powf(y).unwrap().get(), 1.0); // not nan, so we can unwrap
assert!(y.div(y).is_err()); // 0/0 is nan, so we get Err

no-std 支持

checked-float 默认支持在 no-std 环境中构建。然而,为了确保未来兼容性,您可能希望明确选择退出默认功能,以防将来添加对 std 的依赖。

[dependencies]
checked-float = { version = "...", default-features = false }

功能

名称 默认 描述
serde 关闭 启用 CheckedFloat 的序列化

依赖项

~480–730KB
~15K SLoC