| Crates.io | const_poly |
| lib.rs | const_poly |
| version | 0.0.5 |
| created_at | 2025-10-17 01:42:01.328338+00 |
| updated_at | 2025-10-25 21:39:51.377204+00 |
| description | Evaluate any multivariable equation or polynomial at compile time with high accuracy and zero runtime overhead. |
| homepage | |
| repository | https://github.com/kmolan/const_poly |
| max_upload_size | |
| id | 1886991 |
| size | 65,803 |
no_std, ensuring no heap allocations, no panics, and no external crates.const fn for each equation.const_poly is a lightweight abstraction for evaluating multi-variable polynomials entirely at compile time. Instead of writing specialized const fn evaluators for every equation you need, const_poly abstracts all of this away using generic, compile-time constructs. The implementation can handle any number of variables, and is capable of evaluating any complex equation with high accuracy. This approach reduces boilerplate, so you can focus on the actual algorithms while writing math expressions in a natural, equation-like syntax:
use const_poly::VarFunction::*;
use const_poly::{Polynomial, const_poly};
//define f(x,y) = 2.5 * x² * y³
const POLY = Polynomial<2> = const_poly!([2.5, Pow(2), Pow(3)]);
//evaluate f(x,y) at (x,y) = (10.0, -5.0)
const RESULT: f64 = POLY_1.evaluate(&[10.0, -5.0]); // -31250.0
// Multi-term polynomial g(x,y,z)
const POLY_2: Polynomial<3> = const_poly!({
[1.2, Pow(2), Pow(-1), Pow(0)], // 1.2 * x² * y⁻¹ * z⁰
[-0.8, Pow(3), Pow(1), Pow(-2)], // -0.8 * x³ * y¹ * z⁻²
[2.5, Pow(-3), Pow(4), Pow(1)], // 2.5 * x⁻³ * y⁴ * z¹
[-1.1, Pow(0), Pow(-2), Pow(3)], // -1.1 * x⁰ * y⁻² * z³
[0.9, Pow(1), Pow(2), Pow(-1)] // 0.9 * x¹ * y² * z⁻¹
});
// (x,y,z) = (2.0,3.0,0.5)
const VARS: [f64; 3] = [2.0, 3.0, 0.5];
const RES: f64 = POLY_2.evaluate(&VARS); // -30.159027778
Every polynomial defined with const_poly is a fully constant object, meaning it can be safely passed, composed, or evaluated anywhere in the codebase in a const context. You can freely pass this object to other const fn, or embed it inside larger data structures. const_poly has zero dependencies and is written completely in a no_std environment.
This library is primarily meant to empower scientific computing and mathematical libraries in rust to perform all numerical approximations entirely at compile time or in const contexts.
Embedded and no_std environments where heapless, panic-free code is essential.
Metaprogramming and symbolic math tools that benefit from evaluating complex expressions entirely at compile time.
//define f(x) = 3 * x²
const POLY: Polynomial<1> = const_poly!([3.0, Pow(2)]);
const RESULT: f64 = POLY.evaluate(&[4.0]); // 3 * (4^2) = 48.0
// define f(x, y) = 2.0 * Sin(x) * Cos(y)
const POLY: Polynomial<2> = const_poly!([2.0, Sin, Cos]);
const RESULT: f64 = POLY.evaluate(&[1.57079632679, 0.0]); // 2.0 * sin(π/2) * cos(0) = 2.0
const POLY: Polynomial<2> = const_poly!({
[1.0, Pow(2), Pow(1)], // 1.0 * x² * y
[0.5, Sin, Cos], // 0.5 * sin(x) * cos(y)
[-2.0, Exp, Pow(-1)] // -2.0 * e^(x) * y⁻¹
});
const RESULT: f64 = POLY.evaluate(&[1.0, 2.0]); // -0.2182818
// f(x, y) = 1.5 * ln(x) * sqrt(y)
const POLY: Polynomial<2> = const_poly!([1.5, Ln, Sqrt]);
const RESULT: f64 = POLY.evaluate(&[2.0, 9.0]); // 3.119162312
const POLY: Polynomial<3> = const_poly!({
[2.0, Pow(2), Sin, Exp], // 2x² * sin(y) * e^(z)
[-1.5, Ln, Pow(-1), Cos], // -1.5 * ln(x) * y⁻¹ * cos(z)
[0.5, Sqrt, Tan, Pow(0)], // 0.5 * sqrt(x) * tan(y)
[1.0, Pow(1), Pow(1), Pow(1)] // x * y * z
});
const VARS: [f64; 3] = [2.0, 0.5, 1.0];
const RESULT: f64 = POLY.evaluate(&VARS); // 10.688476972
Follow the full tutorial at TUTORIAL.md
See BENCHMARKS.md
See CONTRIBUTIONS.md
const_poly is licensed under the MIT license.
If you use this library in your project, a shoutout or mention would be awesome!
Add polynomial operations like add/subtract/multiply.
String representation for the polynomial.
Add more benchmarking.