#numbers #bits #posit #unum #p32 #p32e2

no-std softposit

Posit 数的实现

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 数学

Download history 86/week @ 2024-03-13 209/week @ 2024-03-20 50/week @ 2024-03-27 86/week @ 2024-04-03 122/week @ 2024-04-10 180/week @ 2024-04-17 81/week @ 2024-04-24 139/week @ 2024-05-01 52/week @ 2024-05-08 41/week @ 2024-05-15 79/week @ 2024-05-22 148/week @ 2024-05-29 124/week @ 2024-06-05 267/week @ 2024-06-12 280/week @ 2024-06-19 467/week @ 2024-06-26

1,152 每月下载量

MIT/Apache

465KB
13K SLoC

crates.io crates.io

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)。这些类型支持 AddAssignSubAssign 操作。例如

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