Crates.io | unsigned-f64 |
lib.rs | unsigned-f64 |
version | 0.2.0 |
source | src |
created_at | 2023-02-26 07:34:21.468489 |
updated_at | 2023-10-05 03:54:50.418585 |
description | A wrapper around f64 that guarantees that the value is always non-negative on the type level. |
homepage | https://github.com/hydrogen602/unsigned-f64 |
repository | https://github.com/hydrogen602/unsigned-f64 |
max_upload_size | |
id | 794889 |
size | 18,119 |
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
.
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
);
std::ops::Rem
for UnsignedF64
&UnsignedF64