Skip to content

Repository files navigation

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,
  • converts values to/from byte arrays,
  • creates values and performs math operations on stack, avoiding heap allocations.

When to Use

You should probably give fdec a try if:

  • you need primitive types like i256 or i1408, which Rust doesn't provide,
  • your business domain is not tolerant to representation errors that may add up during computations (like working with money in finance),
  • other libraries that provide decimal numbers are not fast enough for you when it comes to doing math,
  • you need to store lots of decimal numbers, and you'd prefer it to be memory-efficient,
  • you're just curious to see how it works.

How to Use

Add the dependency on fdec to your Cargo.toml:

[dependencies]
fdec = "0.3.1"

Import it at your crate's root with the macro_use attribute:

#[macro_use]externcrate fdec;

Add custom numeric types to your project by calling fdec* macros:

fdec64!{// Use 64-bit units
module bigdec,// Put all the generated code into the `bigdec` module
name BigDec,// The name for the generated type
length 5,// 5 * 64-bit units = 320 bits to store numbers
scale 50// Use 50 decimal places}

Example

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

#[macro_use]externcrate 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 scopefnmain(){// Use itlet 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:

About

Fixed-size fixed-point numeric types for Rust

Resources

Stars

8 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages