43个版本 (27个稳定版)
3.2.0 | 2024年4月3日 |
---|---|
3.1.0 | 2024年3月23日 |
3.0.4 | 2023年7月20日 |
3.0.3 | 2023年1月24日 |
0.2.0 | 2020年6月18日 |
#166 in 解析器实现
每月355次下载
在 2 crates 中使用
320KB
8K SLoC
kalk
Kalk是一个支持用户定义变量和函数的数学解析库。它可以解析以下示例
f(x, y) = sum(1, 3, (2sin4/x!)^y) + cos(n deg)
a = 3
f(a, 2)
>> 1.1899401098014355
功能
- 运算符:
+
、-
、*
、/
、!
- 分组:
()
、[]
、⌈ceil⌉
、⌊floor⌋
- 向量:(x, y, z, ...)
- 矩阵:[x, y, z; a, b, c; ...]
- 预定义函数和常数
- 用户定义函数和变量。
f(x, y) = xy
,x = 5
- 使用牛顿法求解根(例如 x^2 = 64)。注意:估计并限于一个根
- 函数的导数(噪声函数或高阶导数可能有些不准确)。
f'(2)
,sin'(-pi)
- 积分。
∫(0, pi, sin(x) dx)
或∫(0, π, sin(x) dx)
,有时可能会有些误差 - 能够理解相当模糊的语法。例如:
2sin50 + 2xy
- 求和函数:
sum(start, to, expression)
例如:sum(1, 3, 2n+1)
等于2*1+1 + 2*2+1 + 2*3+1
=15
- 分段函数:
f(x) = { f(x + 1) if x <= 1; x otherwise }
在输入最后的}
之前按下回车键将创建新行而不会提交 - 不同的数字基:可以是类似
0b1101
、0o5.3
、0xff
的格式,或者类似1101_2
的格式。后者不支持字母,因为它们将被解释为变量 - 其他:用分号分隔表达式以在同一行上写入它们,使用
ans
变量获取先前计算表达式的值
Rust 使用
use kalk::parser;
let mut parser_context = parser::Context::new();
let precision = 53;
let result = parser::eval(&mut parser_context, "5*3", precision).unwrap().unwrap();
assert_eq!(result.to_f64(), 15f64);
使用 f64 而不是 rug::Float
cargo 特性 rug
启用 rug,并默认使用。如果您禁用此特性,kalk 将使用 f64
代替,使其更具可移植性。
编译
请确保您已安装 diffutils
、gcc
、make
和 m4
。
JavaScript 使用
const kalk = await import("@paddim8/kalk");
const context = new kalk.Context();
console.log(context.evaluate("2pi + 3").toScientificNotation().toString());
依赖项
~4MB
~74K SLoC