fdec 0.3.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,
- 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`:

```toml
[dependencies]
fdec = "0.2"
```

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

```rust
#[macro_use]
extern crate fdec;
```

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

```rust
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.

```rust
#[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:
- Many ways to create values: [creation.rs]https://github.com/alygin/fdec/tree/master/examples/creation.rs
- Compute Fibonacci numbers: [fibonacci.rs]https://github.com/alygin/fdec/tree/master/examples/fibonacci.rs
- Calculate square root with high precision: [sqrt.rs]https://github.com/alygin/fdec/tree/master/examples/sqrt.rs