1 个不稳定版本
0.1.0 | 2024年1月23日 |
---|
#1624 在 算法
155KB
3.5K SLoC
精确算术包
⚠️正在积极开发中⚠️
此包提供精确算术数据结构,用作 f64
的替代品,当要使用的表达式在代数上很优雅时。最初开发是为了解决涉及平方根 √ 的矩阵乘法问题,在多次乘法之后浮点误差增加。有几个变体,每个都有其权衡
表达式 Rc
- 没有
Copy
特性
此使用 Rc
来保持引用。因此,它没有实现 Copy
特性,因此不能用作浮点的替代品。然而,如果你运行例如侵蚀模型,它不会像那样严重地耗尽你的内存。
表达式域
- 域作为工厂构造函数
- 没有
One
和Zero
特性 - 如果不小心使用,会填满你的内存
- 额外的间接级别
在数学意义上使用 "域"
通过域,我们指每个无限的实数或复数系统,自身封闭且完美,任何两个这样的数相加、相减、相乘或相除又得到该系统中的一个数。 —— Richard Dedekind,1871
也就是说,对于在域中对两个数应用的操作,结果是添加到该域中。在不同域中对两个数进行操作的操作将结果添加到操作的一侧
use exact::expr_field::TypeField;
let f1 = TypeField::new();
let f2 = TypeField::new();
let phi1 = f1.parse("Σ[1,√5]")
let phi2 = f2.parse("Σ[1,√5]")
let phi_squared = phi1 * phi2;
assert!(std::ptr::eq(phi_squared.field(),f1))
assert_eq!(phi_squared, f1.parse("Σ[6,3√5]"))
静态域
- 尚未实现
One
和Zero
特性
使用默认域的静态可用的域
解析和打印
解析和类型是可变的。理想情况下,我们能够以完整的人可读形式解析和打印表达式: 1+√5
这将经历以下变化
确定
current: `Σ[(1,Ι),(1,√5)]` `Π[(π,2),(e,1)]`
omit redundant `1`s: `Σ[1,√5]` `Π[π²,e]`
replace `,` by `+`/"": `Σ[1+√5]` `Π[π²e]`
可能
remove `Σ`/'Π' sign: `[1+√5]` `[π²e]`
remove delimiters `1+√5` `π²e`
轻松输入的提示
- 使用希腊键盘布局
- 'Σ' : 'S'
- 'Π': 'P'
- 'π': 'p'
- 'ξ': 'j'
- 使用具有 Unicode 输入插件/支持的环境
良好显示的提示
- 使用JuliaMono字体
依赖项
~5MB
~102K SLoC