#f64 #unsigned #non-negative #float #nonnegative

bin+lib unsigned-f64

围绕 f64 的包装,保证类型级别上的值始终为非负

2 个不稳定版本

0.2.0 2023 年 10 月 5 日
0.1.0 2023 年 2 月 26 日

#767 in 数学

MIT 许可证

17KB
407

UnsignedF64

一个库,通过创建一个不能为负的 UnsignedF64 来为浮点数添加无符号整数的等效功能。这个想法适用于模拟代码等场景,在这些场景中,错误难以调试,类型也没有增加很多安全性(因为一切都是 f64)。

注意

鉴于这个问题比我预期的要复杂得多(例如,-0.0 不是一个负数,但通过 -Inf 创建了一个通向负数的路径,请参阅 https://github.com/hydrogen602/unsigned-f64/issues/1),因此我建议使用 typed_floats 库,该库更全面地解决了这个问题。

为了解决上述问题,在调用 UnsignedF64::new 时,将 -0.0 转换为 0.0

如何

使用 UnsignedF64::new 创建新的无符号浮点数。这将检查 f64 是否为负数,并返回一个 Option。在 UnsignedF64 上实现了许多 f64 方法,以便在保证非负性时无需重新检查数字,例如,UnsignedF64 的平方根保证为非负,因此 sqrt 返回 UnsignedF64

// An example of using the UnsignedF64 type.

let point1 = (3., 4.);
let point2 = (5., 12.);

fn distance(p1: (f64, f64), p2: (f64, f64)) -> UnsignedF64 {
    let x = p1.0 - p2.0;
    let y = p1.1 - p2.1;
    (UnsignedF64::square(x) + UnsignedF64::square(y)).sqrt()
}

let d = distance(point1, point2);

println!(
    "The distance between {:?} and {:?} is {}",
    point1, point2, d
);

待办事项

  • 实现我不确定是否可以返回负数的那些方法
  • std::ops::Rem 实现 UnsignedF64
  • &UnsignedF64 实现特性
  • 实现 serde 的序列化和反序列化(使用特性?)

无运行时依赖