fdec 0.2.0

A collection of macros for generating fixed-size fixed-point numeric types for Rust.
Documentation

fdec

A collection of macros for generating fixed-size fixed-point numeric types that exactly fit your domain. The types are fully equipped for performing mathematical computations and are easy to use.

With a simple macro call you get a type that:

  • has no representation errors in the range, defined by the type parameters,
  • supports arithmetic operations: +, -, *, /, %, <<, >>,
  • comes with mathematical functions: abs(), powi(), sqrt(),
  • has special values NaN and ±Infinity, and uses them instead of panicing,
  • provides basic mathematical constants,
  • seamlessly interacts with Rust's primitive types,
  • creates values and performs math operations on stack, avoiding heap allocations.

Usage

First, add the dependency on fdec to your Cargo.toml:

[dependencies]
fdec = "0.2"

Second, import it at your crate's root with the macro_use attribute:

#[macro_use]
extern crate fdec;

Now, everything is ready for adding custom numeric types to your project.

Example

Here, we define the Decimal structure that represents 160-bit numbers with 30 decimal places.

#[macro_use]
extern crate fdec;

fdec32! {            // Use 32-bit units
    module dec,      // Put all the generated code into the `dec` module
    name Decimal,    // Name the main struct `Decimal`
    length 5,        // 5 * 32-bit units = 160 bits to store numbers
    scale 30         // Use 30 decimal places
}

use dec::*;          // Bring the generated stuff to the scope

fn main() {
    // Use it
    let a = Decimal::one();
    let b = Decimal::from(14);
    let c = dec!(9);
    let result = a + 30 * (b / c).powi(3);
    println!("{} + 30 * ({} / {})^3 = {}", a, b, c, result);
    // 1 + 30 * (14 / 9)^3 = 113.92181069958847736625514403278
}

More examples come with the crate's source code: