21 releases (10 stable)
1.3.1  Sep 19, 2024 

1.2.3  Jul 24, 2024 
0.10.0  Apr 18, 2024 
0.9.0  Mar 27, 2024 
0.2.0  Nov 12, 2023 
#254 in Rust patterns
7,451 downloads per month
Used in 14 crates
(5 directly)
48KB
1.5K
SLoC
iFloat
This fixed float math library provides an efficient and deterministic solution for arithmetic and geometric operations.
Features

Fixedpoint arithmetic using FixNumber for deterministic calculations

2D fixedpoint vector operations with FixVec

Trigonometric functions using fixedpoint angles

Angle conversion and manipulation utilities in FixAngle
Installation
use i_float::fix_float::FixFloat;
use i_float::fix_vec::FixVec;
How It Works
The `FixFloat` struct uses fixedpoint arithmetic to perform calculations with a high degree of precision and determinism. It supports numbers in the range 2^21  1 to 2^21 + 1 with a precision of 1/1024, and is most suitable for the range 1,000,000 to 1,000,000 with a precision of 0.01.
Fixedpoint numbers are represented using a fixed number of bits for the fractional part. In this implementation, the number of bits representing the fractional part of the fixedpoint number is 10, which allows for a precision of 1/1024 or approximately 0.001.
Here are some examples of fixedpoint number representation:
 1 / 1024 ≈ 0.001 (represented as 1)
 256 / 1024 = 0.25 (represented as 256)
 1024 / 1024 = 1 (represented as 1024)
 (1024 + 512) / 1024 = 1.5 (represented as 1536)
 (2048 + 256) / 1024 = 2.25 (represented as 2304)
By using the `FixFloat` struct, you can perform arithmetic operations using i64 values while maintaining the precision of floatingpoint numbers, ensuring deterministic behavior across different platforms and devices.
Usage
FixFloat
The `FixFloat` struct represents a fixedpoint number using a `i64` as the underlying storage, allowing deterministic arithmetic operations. Use `FixFloat` for calculations instead of `i32` or `i64` when deterministic behavior is required. `FixFloat` provides a way to perform arithmetic operations with `i64` values while maintaining the precision of floatingpoint numbers.
let a = FixFloat::new_number(1);
let b = FixFloat::new_number(2);
let c = a + b;
FixVec
The `FixVec` struct represents a 2D fixedpoint vector, providing various utility methods and operators for vector operations. Use `FixVec` for 2D geometric calculations when deterministic behavior is required.
let a = FixVec::new_number(1, 1);
let b = FixVec::new_number(1, 1);
let c = a + b;
FixAngle
The `FixAngle` class provides various utility methods for working with fixedpoint angles, including trigonometric functions and angle conversion.
let fix_angle = FixAngle::new_from_radians_f64(angle);
let fix_sin = fix_angle.sin();
let i64_sin = fix_sin.double();
License
Dependencies
~0.3–1MB
~21K SLoC