#fixed-point #fixed #numeric

无std fixed_math

为定点数提供一些数学特性和函数

9个不稳定版本 (3个破坏性更改)

0.4.1 2023年9月7日
0.4.0 2023年9月1日
0.3.0 2023年8月30日
0.2.2 2023年8月8日
0.1.1 2023年1月17日

#167 in 数学

Download history 2/week @ 2024-03-12 10/week @ 2024-03-26 47/week @ 2024-04-02

每月63次下载

MIT/Apache

65KB
1K SLoC

固定数学

此库实现了定点数的解析/三角函数。

实现的功能

  • sqrt 来自特性 Sqrt
    • Sqrt 没有为小于2个整数位的定点数实现,但有在这些类型上工作的函数:sqrt_i1 等...
  • sin_cossincostan 来自特性 SinCos
    • SinCos 没有为小于8 (TODO 7) 个整数位的定点数实现,因为这些类型上的表值可能会溢出。
    • 所有计算都在度数内进行
      • 除了有一个非常不精确的 sin_cos_rad 函数外,还有一个 sin_cos_rad 函数;请查看源代码 了解原因,欢迎修复它(对我来说这不是优先事项)

可选功能

  • std:固定库的std特性,目前还没有合适的无std支持...

示例

有一些特性和独立函数,请参阅示例了解如何使用它们。

错误

请查看示例以了解此实现产生的错误程度。

通常 sqrt 的误差约为1-2 Delta。
(Delta =到下一个可表示数字的距离)

sin_cos 可能会产生更大的误差,约为1-2位小数。

基准测试

您可以在 benches 中检查或运行基准测试。

以下是我得出的一些结论

SinCos

2022-09-28

sin_cos的计算时间随定点数的字节大小而变化。

  • I10F6: ~ 8ns
  • I16F16: ~ 9ns
  • I32F32: ~ 18ns
  • I32F96: ~ 210ns

备注

  • 有许多不同的整位/小数位组合;我没有测试它们
    (整位必须大于或等于10(但我可能可以进一步放宽这一点))
  • 这些都是度数的计算
  • 代码使用本地CPU特性编译
  • 除非内存受限,否则请使用FixedI32而不是FixedI16。
  • 我在相同的风格下对cordicsin_cos在FixedI64上进行了基准测试。
    • 请注意,cordic使用弧度,我使用了相同的角度值。
    • 因此,它们可以在相同的大小表示下处理更大的角度的正弦和余弦。
    • 该crate在相同的角度大小上大约快1.5-2倍。

2023-07-30

系统信息
                   -`                    
                  .o+`                   --------
                 `ooo/                   OS: Arch Linux x86_64
                `+oooo:                  Host: X570 AORUS ELITE -CF
               `+oooooo:                 Kernel: 6.4.7-arch1-1
               -+oooooo+:                
             `/:-:++oooo+:               
            `/++++/+++++++:              Shell: fish 3.6.1
           `/++++++++++++++:             Resolution: 3840x2160
          `/+++ooooooooooooo/`           DE: Hyprland
         ./ooosssso++osssssso+`          
        .oossssso-````/ossssss+`         
       -osssssso.      :ssssssso.        Terminal: WezTerm
      :osssssss/        osssso+++.       CPU: AMD Ryzen 7 5800X (16) @ 3.800GHz
     /ossssssss/        +ssssooo/-       GPU: AMD ATI Radeon RX 7900 XT/7900 XTX
   `/ossssso+/:-        -:/+osssso+-     Memory: 32014MiB
  `+sso+:-`                 `.-/+oso:
 `++:.                           `-/+/
 .`                                 `/

现在性能不同,并且没有使用原生CPU特性。

  • I10F6: ~ 430ps
  • I16F16: ~ 15ns
  • I32F32: ~ 25ns
  • I32F96: ~ 255ns

使用原生CPU特性RUSTFLAGS="-C target-cpu=native" cargo bench

  • I10F6: ~ 420ps
  • I16F16: ~ 8ns
  • I32F32: ~ 22ns
  • I32F96: ~ 222ns

备注

  • I32F32和I32F96的性能有所下降。
  • I10F6的性能大幅提升,因此我们可能考虑在不需要很高精度的场合使用16位定点值。
  • cordic基准测试未检查...

许可证

本存储库中的所有代码均根据您的选择,分别受以下许可证的约束:

任选其一。

贡献

除非您明确表示,否则任何有意提交以包含在您的工作中的贡献(根据Apache-2.0许可证定义),应如上所述双重许可,不附加任何额外条款或条件。

归属

我们使用来自cordic的代码修改,该代码以BSD-3-Clause许可证发布。

依赖关系

~2.5MB
~45K SLoC