#dimensional-analysis #unit #units #quantities #library

无std dana

编译时通过泛型类型进行维度分析

4个版本 (2个重大更改)

0.4.0 2024年8月10日
0.3.1 2024年8月6日
0.3.0 2024年8月5日
0.2.0 2024年8月5日

#178 in 数学

Download history 253/week @ 2024-08-03 100/week @ 2024-08-10

每月353次下载

Apache-2.0

195KB
4K SLoC

Dana

Crates.io docs.rs

通过泛型类型进行编译时维度分析。

概述

维度分析是一种通过跟踪单位之间的关系来确保计算正确性的方法。这在无需查找的情况下确定关系也很有用。例如,假设你有一个时间 t (T) 和一个速度 v (L/T),你想找到一个距离 d (L)。简单的代数可以告诉你 L = (L/T) × T,因此,d = v × t

此库使用Rust的静态类型系统实现这些检查。因此,单位之间的任何不兼容性都会成为 编译时错误,确保所有代码都是维度一致的。


此函数编译成功

use dana::{Quantity, units::{Length, Speed, Time}};

fn speed(dist: Quantity<Length>, time: Quantity<Time>) -> Quantity<Speed> {
    dist / time
}

而此函数,因为 Speed 被定义为 UnitDiv<Length, Time>,所以不会编译,会引发 mismatched types 错误,因为表达式是错误的

use dana::{Quantity, units::{Length, Speed, Time}};

fn speed(dist: Quantity<Length>, time: Quantity<Time>) -> Quantity<Speed> {
    time / dist
}
error[E0308]: mismatched types
 --> src/main.rs:4:5
  |
3 | fn speed(dist: Quantity<Length>, time: Quantity<Time>) -> Quantity<Speed> {
  |                                                           --------------- expected `Quantity<UnitDiv<Length, Time>>` because of return type
4 |     time / dist
  |     ^^^^^^^^^^^ expected `Quantity<UnitDiv<Length, Time>>`, found `Quantity<UnitDiv<Time, Length>>`
  |
  = note: expected struct `Quantity<UnitDiv<Length, Time>>`
             found struct `Quantity<UnitDiv<Time, Length>>`

有关更多信息,请参阅库文档

Cargo功能

以下Cargo功能可用于启用额外功能

  • chrono:支持在 Quantity<Time>chrono::TimeDelta 之间进行转换
  • rand:支持 rand 样本特性
  • serde:支持 serde 特性
  • simd:使用不稳定特性 portable_simd 的实验性 QtySimd 数组

依赖项

~1.8–2.6MB
~58K SLoC