6 个版本

0.3.2 2020 年 11 月 25 日
0.3.1 2020 年 10 月 21 日
0.2.0 2020 年 10 月 12 日
0.1.1 2020 年 10 月 12 日

数学 类别下排名第 625

每月下载量 22
用于 prepona

MIT 许可证

61KB
581 行代码(不包括注释)

Logo by www.freepik.com

幅度 - 从无穷大到更远!

Crate API
当您需要使用像 Dijkstra 最短路径算法Floyd-Warshall 算法 这样的算法,这些算法需要无穷大值才能优雅地编写时,此 crate 非常有用。

一个简单的例子可以是找到一个向量中的最大值

use magnitude::Magnitude;

fn find_max(vec: &Vec<Magnitude<i32>>) -> Magnitude<i32> {
    let mut max = Magnitude::NegInfinite;
    for val in vec {
        if *val > max {
            max = *val;
        }
    }

    max
}

let vec: Vec<Magnitude<i32>> = vec![2.into(), 3.into(), 6.into(), (-10).into()];
assert_eq!(find_max(&vec), 6.into());

您可以在幅度上执行所有 有效 的比较(==、!=、>、<、>=、<=)和算术(+、-、*、/、+=、-=、*=、/=)操作。
以下列出了无效操作,这意味着任何其他操作都是有效的。

无效操作

  • 比较
    • 两个 PosInfinite
    • 两个 NegInfinite
  • 算术
    • 加法
      • PosInfinite + NegInfinite
    • 减法
      • PosInfinite - PosInfinite
      • NegInfinite - NegInfinite
    • 乘法
      • 零 * PosInfinite
      • 零 * NegInfinite
    • 除法
      • 非零 / PosInfinite
      • 非零 / NegInfinite
      • PosInfinite / 零
      • NegInfinite / 零
      • PosInfinite / PosInfinite
      • PosInfinite / NegInfinite
      • NegInfinite / PosInfinite
      • NegInfinite / NegInfinite

幅度与 f64f32 无穷大的关系

自0.2.0版本起,将f64::INFINITYf64::NEG_INFINITYf32::INFINITYf32::NEG_INFINITY视为无穷大

use magnitude::Magnitude;

let pos_inf: Magnitude<f64> = f64::INFINITY.into();
let neg_inf: Magnitude<f64> = f64::NEG_INFINITY.into();
assert!(pos_inf.is_pos_infinite());
assert!(neg_inf.is_neg_infinite());

let pos_inf: Magnitude<f32> = f32::INFINITY.into();
let neg_inf: Magnitude<f32> = f32::NEG_INFINITY.into();
assert!(pos_inf.is_pos_infinite());
assert!(neg_inf.is_neg_infinite());

发布

  • 0.3.2版本:强制使用Copy代替Clone
  • 0.3.1版本:修复了is_finite()的错误。
  • 0.3.0:
    • 添加from_vec,可以从值向量构建Magnitude向量
      use magnitude::Magnitude;
      
      let magnitude_vec = Magnitude::from_vec(&vec![1,2,3]);
      
      assert_eq!(magnitude_vec[0], 1.into());
      assert_eq!(magnitude_vec[1], 2.into());
      assert_eq!(magnitude_vec[2], 3.into());
      
    • 添加unwrap以方便访问Finite内的值
      use magnitude::Magnitude;
      
      let one: Magnitude<i32> = 1.into();
      
      assert_eq!(one.unwrap(), 1);
      
  • 0.2.0版本:正确处理f64::INFINITYf64::NEG_INFINITYf32::INFINITYf32::NEG_INFINITY
    特别感谢@niklasmohrin@smarnach

依赖项

~155KB