27 个版本
0.4.0 | 2022 年 12 月 14 日 |
---|---|
0.3.9 | 2019 年 7 月 17 日 |
0.3.5 | 2019 年 6 月 30 日 |
0.2.7 | 2019 年 6 月 9 日 |
0.1.7 | 2019 年 5 月 17 日 |
#316 in 数学
1,152 每月下载量
465KB
13K SLoC
softposit-rs
Rust 端的 SoftPosit 仓库。
目前支持以下类型
- P32E2 或 P32:32 位 posit,指数大小 ES=2;
- P16E1 或 P16:16 位 posit,ES=1;
- P8E0 或 P8:无指数位的 8 位 posit。
对泛型类型 PxE1{N} 和 PxE2{N} 的初始支持。需要 rust 1.51。
示例
从 f64 转换,加法
use softposit::P32;
fn main() {
let a = P32::from(12.3);
let b = P32::from(154.);
let c = a + b;
println!("c = {0} or c = {0:?}", c);
}
Quire
每个 Posit 类型都有对应的 Quire 类型(Q32、Q16、Q8)。这些类型支持 AddAssign
和 SubAssign
操作。例如
use softposit::{P32, Q32};
// c == 12.3*0.4 - 6.3*8.4 == -48;
fn main() {
let mut q = Q32::init();
q += (P32::from(12.3), P32::from(0.4));
q -= (P32::from(6.3), P32::from(8.4));
let c = q.to_posit();
println!("c = {0} or c = {0:?}", c);
}
数学
数学函数(如三角函数)部分实现了 P32E2 类型。对于复杂计算,请使用 num::Complex
类型。
线性代数
您还可以使用 linalg
功能通过 nalgebra crate 定义的矩阵操作。
use softposit::P32;
use nalgebra::{Dynamic, Matrix, VecStorage};
type DMatrix = Matrix<P32, Dynamic, Dynamic, VecStorage<P32, Dynamic, Dynamic>>;
fn main() {
let a = DMatrix::new_random(5, 5);
println!("Matrix A = {}", a);
let decomp = &a.clone().lu();
if let Some(c) = decomp.try_inverse() {
println!("Inverse matrix Aˉ¹ = {}", c);
println!("Check Identity");
let ones = a * c;
println!("A × Aˉ¹ = {}", ones);
} else {
println!("Matrix A can't be inverted");
}
}
cargo build --features="linalg,rand"
基准测试
cargo bench
类型 | 操作 | i3-2310M @ 2.10GHz | i5-3470 @ 3.20GHz |
---|---|---|---|
P32E2 | + | 47 MPOPS | 82 MPOPS |
- | 45 MPOPS | 83 MPOPS | |
* | 56 MPOPS | 99 MPOPS | |
/ | 25 MPOPS | 42 MPOPS | |
√⎺⎺ | 48 MPOPS | 92 MPOPS | |
round | 89 MPOPS | 159 MPOPS |
依赖项
~0.1–1MB
~20K SLoC