brine-fp
brine-fp copied to clipboard
Fixed-point math library with logarithmic and exponential functions. Designed for blockchain applications.
brine-fp
brine-fp is a 192-bit fixed-point math library built for high-precision, deterministic computation in constrained environments like the Solana SVM. It provides arithmetic, exponentiation, logarithms, and powers using u192-based representations, and is optimized for low compute unit (CU) usage on-chain.
⚡ Performance
| Operation | CU (Approx.) |
|---|---|
log(2) |
~18,500 |
exp(0.5) |
~15,000 |
pow(2, ½) |
~100 |
frexp(2) |
~150 |
These values are measured inside the Solana SVM (via test programs).
Features
- 192-bit unsigned & signed fixed-point types with 18 decimal places.
- Supports
log,exp,pow,floor,ceil,almost_eq, etc. - Remez polynomial approximations based on FreeBSD
msun. - Designed for deterministic and overflow-aware computation.
- Suitable for smart contract environments and financial logic.
Quick Start
use brine_fp::UnsignedNumeric;
// Construct a fixed-point number: 5.0
let five = UnsignedNumeric::new(5);
// Compute its exponential
let result = five.signed().exp().unwrap();
println!("e^5 ≈ {}", result.to_string());
Internal Representation
Each UnsignedNumeric wraps a InnerUint([lo, mid, hi]), representing a 192-bit unsigned integer:
InnerUint([lo, mid, hi])
// Equivalent to:
// value = lo + (mid << 64) + (hi << 128)
All values are scaled by 10^18, enabling 18-digit decimal precision.
This format ensures:
- Extreme range: from
1e-18up to~6.3 × 10³⁹real-world units - High precision: 18 decimals
- Fully deterministic integer math (no
f64, nofloat)
Use Cases
- On-chain bonding curves
- DeFi math & simulations
- Deterministic pricing formulas
- Token economics
- Time-value calculations
- Anywhere you want
exp()orlog()withoutf64
Upstream Acknowledgements
brine-fp is heavily based on prior work and stands on the shoulders of giants. The core math and algorithms are derived from:
- Solana Labs math-spl (Apache 2)
- Strata Foundation bonding curves (Apache 2 with permission)
Contributing
Contributions are welcome! Please open issues or PRs on the GitHub repo.