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

bin+lib unsigned-f64

A wrapper around f64 that guarantees that the value is always non-negative on the type level

2 unstable releases

0.2.0 Oct 5, 2023
0.1.0 Feb 26, 2023

#1164 in Math

MIT license

17KB
407 lines

UnsignedF64

A library to add the equivalent of unsigned ints to floats by making a UnsignedF64 that can't be negative. This idea is for cases like simulation code, where bugs are hard to debug and types don't add much safety (Since everyting is a f64).

Note:

Given that this problem is way more complicated than I thought (e.g. -0.0 isn't negative but creates a path to negative numbers via -Inf, see https://github.com/hydrogen602/unsigned-f64/issues/1), I would thus recommend the typed_floats library which addresses this problem much more throughly.

In order to address the above issue, -0.0 will be converted to 0.0 when calling UnsignedF64::new.

How To

Create new unsigned floats using UnsignedF64::new. This will check if the f64 is negative or not and return an Option. Many f64 methods are implemented on UnsignedF64 so that numbers don't have to be rechecked when non-negativeness is guaranteed, e.g. the square root of an UnsignedF64 is guaranteed to be non-negative, so sqrt returns 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
);

ToDo

  • Implement the methods where I'm not sure if they can return negative numbers or not
  • Implement std::ops::Rem for UnsignedF64
  • Implement traits for &UnsignedF64
  • Implement serde's Serialize & Deserialize (using features?)

No runtime deps