https://github.com/pascaldekloe/b10
library for decimals
https://github.com/pascaldekloe/b10
Last synced: 3 months ago
JSON representation
library for decimals
- Host: GitHub
- URL: https://github.com/pascaldekloe/b10
- Owner: pascaldekloe
- License: cc0-1.0
- Created: 2024-06-27T16:36:14.000Z (about 1 year ago)
- Default Branch: master
- Last Pushed: 2025-02-14T17:54:04.000Z (5 months ago)
- Last Synced: 2025-04-08T06:04:42.418Z (3 months ago)
- Language: Rust
- Homepage:
- Size: 69.3 KB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](https://github.com/pascaldekloe/b10/actions/workflows/rust.yml)
## Decimal Numbers For The Rust Programming Language
The API provides a light-weight alternative to arbitrary-precision arithmetic.
The `const` generics for base-ten exponents fix the computation steps involved
at compile time. You basically get the speed of 64-bit primitives combined with
the safety from big-number implementations.```rust
let cents = b10::BaseCount::<-2>::from(199);
assert_eq!("€ 1.99", format!("€ {cents}"));
```All operation is lossless by design unless explicitly stated otherwise in the
name of the respective method (e.g. `log10_floor`). This lossless guarantee
applies to parsing and formatting too. Can't read nor write digits beyond the
base resolution.```rust
// metric prefixes
use b10::{Milli, Nano, Pico};
let mA = Milli::from(100);
let ns = Nano::from(4);// multiply into another base
let (pC, overflow):(Pico, Pico) = mA.mul(ns);
if overflow != Pico::ZERO {
panic!("product exceeds 2⁶⁴ − 1 pico");
}// pretty formatting options
assert_eq!(
"0.100 × 0.000000004 = 0.000000000400",
format!("{mA} × {ns} = {pC}"),
);
assert_eq!(
"100E-3 × 4E-9 = 400E-12",
format!("{mA:E} × {ns:E} = {pC:E}"),
);
assert_eq!(
"100 mA × 4 ns = 400 pC",
format!("{mA:#}A × {ns:#}s = {pC:#}C"),
);
```Formatting and parsing performance is slighty faster than the Display and
FromStr traits from the standard library.```
test fmt_tests::format_exponent_kilo ... bench: 7.81 ns/iter (+/- 0.07)
test fmt_tests::format_exponent_u64 ... bench: 9.68 ns/iter (+/- 0.36)
test fmt_tests::format_fraction_milli ... bench: 7.82 ns/iter (+/- 0.05)
test fmt_tests::format_fraction_u64 ... bench: 19.87 ns/iter (+/- 0.37)
test fmt_tests::format_integer_natural ... bench: 6.72 ns/iter (+/- 0.07)
test fmt_tests::format_integer_u64 ... bench: 8.59 ns/iter (+/- 0.07)
test fmt_tests::format_sub_zero_quecto ... bench: 7.50 ns/iter (+/- 0.03)
test fmt_tests::format_sub_zero_u64 ... bench: 22.50 ns/iter (+/- 0.17)
test text_tests::parse_exponents_as_f64 ... bench: 9.14 ns/iter (+/- 0.27)
test text_tests::parse_exponents_as_pico ... bench: 7.81 ns/iter (+/- 0.04)
test text_tests::parse_fractions_as_f64 ... bench: 7.78 ns/iter (+/- 0.04)
test text_tests::parse_fractions_as_nano ... bench: 5.39 ns/iter (+/- 0.09)
test text_tests::parse_integers_as_centi ... bench: 3.75 ns/iter (+/- 0.01)
test text_tests::parse_integers_as_natural ... bench: 3.75 ns/iter (+/- 0.03)
test text_tests::parse_integers_as_u64 ... bench: 3.12 ns/iter (+/- 0.01)
```This is free and unencumbered software released into the
[public domain](https://creativecommons.org/publicdomain/zero/1.0).