unsigned-f64

Crates.iounsigned-f64
lib.rsunsigned-f64
version0.2.0
sourcesrc
created_at2023-02-26 07:34:21.468489
updated_at2023-10-05 03:54:50.418585
descriptionA wrapper around f64 that guarantees that the value is always non-negative on the type level.
homepagehttps://github.com/hydrogen602/unsigned-f64
repositoryhttps://github.com/hydrogen602/unsigned-f64
max_upload_size
id794889
size18,119
Jonathan Rotter (hydrogen602)

documentation

https://github.com/hydrogen602/unsigned-f64#readme

README

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?)
Commit count: 13

cargo fmt