1 个不稳定版本

0.1.0 2024年1月23日

#1624算法

AGPL-3.0-or-later AND WTFPL

155KB
3.5K SLoC

精确算术包

⚠️正在积极开发中⚠️

此包提供精确算术数据结构,用作 f64 的替代品,当要使用的表达式在代数上很优雅时。最初开发是为了解决涉及平方根 √ 的矩阵乘法问题,在多次乘法之后浮点误差增加。有几个变体,每个都有其权衡

表达式 Rc

  • 没有 Copy 特性

此使用 Rc 来保持引用。因此,它没有实现 Copy 特性,因此不能用作浮点的替代品。然而,如果你运行例如侵蚀模型,它不会像那样严重地耗尽你的内存。

表达式域

  • 域作为工厂构造函数
  • 没有 OneZero 特性
  • 如果不小心使用,会填满你的内存
  • 额外的间接级别

在数学意义上使用 "域"

通过域,我们指每个无限的实数或复数系统,自身封闭且完美,任何两个这样的数相加、相减、相乘或相除又得到该系统中的一个数。 —— 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]"))

静态域

  • 尚未实现
  • OneZero 特性

使用默认域的静态可用的域

解析和打印

解析和类型是可变的。理想情况下,我们能够以完整的人可读形式解析和打印表达式: 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