16 个稳定版本
2.1.0 | 2022年2月12日 |
---|---|
2.0.0 | 2022年1月27日 |
1.7.0 | 2022年1月27日 |
0.1.0 |
|
#3 in #algebraic-expressions
53 下载/月
37KB
757 行
calc_lib
一个用于使用正确运算顺序从输入中评估代数表达式的包。
最初是为了用于基于终端的计算器应用程序而设计的。
特性
- 基本代数运算
- 正确的运算顺序(函数始终先于 PEMDAS 进行评估)
- 可选定义变量
- 整数运算和浮点运算(任选其一)
- 如 log、sin、cos、tan 等函数
- 可选定义函数
计划中的特性
- 方程验证(例如
2 + 2 = 4 是有效的,而
2 + 2 = 5
则不是) - 求解变量(如
x + 2 = 4
将得到x = 2
)
可能在未来实现的功能
- 求解多个变量(例如,
3x - y = 7,
2x + y = 8
将得到x = 3
,y = 2
)
默认函数
使用 Functions::default;
访问
log(底数,值)
sqrt(值)
sin(值)
cos(值)
tan(值)
自定义错误系统
- 公开了 Error 枚举,允许用户确定发生了哪种类型的错误,并获取有关它的所有相关信息
- 如果需要,允许用户自行处理错误,也可以直接打印出来。
示例
整数方程
// evaluates an algebraic equation
use calc_lib::evaluate;
fn main() {
// the equation to evaluate
let eval = evaluate("1 + 2 * 3");
// print out errors if they occur, or handle them another way
if eval.is_err() {
panic!("{}", eval.err().unwrap());
}
// the result is a f64, which can then be used as needed
// here, I am just asserting that it is the value it should be.
assert_eq!(eval.unwrap() as i32, 7);
}
小数方程
use calc_lib::evaluate;
fn main() {
// define the expression
let expression = "1.3 + 2.5 * 3.1";
// evaluate the expression
let eval = evaluate(expression);
// handle errors that may occur
if eval.is_err() {
panic!("{}", x.unwrap_err());
}
assert_eq!(eval.unwrap(), 9.05);
}
用变量求解
use calc_lib::{evaluate_with_defined, Definitions, Functions, Error};
fn main() {
// define x as 16
let mut defs = Definitions::new();
defs.register("x", 16);
// create the functions list
// this defines an empty Functions struct with no functions.
// for functions like log, sqrt, sin, cos, tan, etc., use `Functions::default()`
let mut funcs = Functions::new();
// this shows the definition of the log function,
// exactly how it is implemented in `Functions::default();`
funcs.register("log", |args| {
// args is of type Vec<f64>
// this takes 2 arguments: base, number
if args.len() != 2 {
return Err(Error::arg_count("log", 2, args.len()));
}
// return the value
Ok(args[1].log(args[0]))
});
// evaluate the expression and verify the results
let eval = evaluate_with_defined("log(2, x)", Some(&defs), Some(&funcs));
if eval.is_err() {
panic!("{}", eval.unwrap_err());
}
assert_eq!(eval.unwrap(), 4.0);
}