#infinity #graph-algorithms #adjacency-matrix #integer

no-std infinitable

Infinity for types without infinite values

8 stable releases

1.6.0 May 10, 2024
1.5.0 Apr 13, 2023
1.4.0 Feb 4, 2023
1.3.0 Apr 18, 2020
1.1.0 Oct 10, 2017

#219 in Math

Download history 1/week @ 2024-08-06 2/week @ 2024-08-13 1/week @ 2024-09-17 6/week @ 2024-09-24

517 downloads per month

BSD-2-Clause

31KB
244 lines

Infinitable (Rust)

Infinitable is a simple library for introducing the notion of "infinity" and "negative infinity" to numeric types, such as integers, that do not have infinite values.

A representation of infinity is useful for graph algorithms such as Dijkstra's algorithm, as well as for representing a graph with an adjacency matrix.

Usage

Simply install the infinitable crate, available on Crates.io.

use infinitable::Infinitable;

fn main() {
	let finite = Infinitable::Finite(5);
	let infinity = Infinitable::Infinity;
	let negative_infinity = Infinitable::NegativeInfinity;

	assert!(finite < infinity);
	assert!(finite > negative_infinity);
}

Tests

Tests are in the tests directory. Simply run cargo test.

Note About Floating-Point Numbers

The infinite values provided by Infinitable are different from the existing infinite values in floating-point numeric types. Therefore, simply using Finite or Infinitable::from to convert from a floating-point value to an Infinitable may lead to unintuitive results:

use infinitable::Infinitable;

fn main() {
	let infinitable_infinity = Infinitable::Infinity;
	let fp_infinity = Infinitable::Finite(f64::INFINITY);

	assert!(infinitable_infinity > fp_infinity);
}

The library provides the from_f32 and from_f64 functions to convert from floating-point values while taking into account infinite values and NaN:

use infinitable::Infinitable;

fn main() {
	let infinitable_infinity = Infinitable::Infinity;
	let fp_infinity = infinitable::from_f64(f64::INFINITY).unwrap();

	assert!(infinitable_infinity == fp_infinity);
}

License

Infinitable is available under the 2-clause BSD license. Refer to LICENSE.txt for details.

Dependencies

~150KB