#对数 #浮点数 #指数 #三角学 #特殊函数

metallic

从头开始实现的C数学函数

10个版本

新版本 0.1.1 2024年8月18日
0.1.0 2024年8月17日
0.0.6 2024年8月13日

191数学 类别中

Download history 122/week @ 2024-08-01 458/week @ 2024-08-08 296/week @ 2024-08-15

每月 876 次下载

MIT 许可证

55KB
601 代码行

metallic

Build status Crates.io Documentation

一个快速的、正确舍入的Rust数学库!

这个库是我的C库Metallic的后续版本,该库从2017年开始为WebAssembly开发。最被期望的功能最终证明是我从头编写的数学函数,所以我决定用Rust重写它们。

启用 融合乘加操作 以获得最佳性能!

如果可用,此crate广泛使用融合乘加指令。遗憾的是,Rust在默认的generic目标中未启用它。为了获得最佳性能,请将以下内容添加到您的.cargo/config.toml中,无论是您的项目还是主目录

[build]
rustflags = ["-Ctarget-cpu=native"]

假设

C库往往对数学函数有严格而陈旧的假设。例如,float函数不敢使用double指令,因为担心主机不支持。在这个库中,我假设所有Rust原始类型都符合IEEE 754标准,并且是主机本地的。换句话说,我假设以下指令可用于浮点类型

除了四个基本算术运算之外的其他假设,导致了对Rust标准库的依赖。

此外,我忽略了Rust中没有的浮点环境。在C和C++中,它也大多未使用,因为它需要#pragma STDC FENV_ACCESS ON和编译器支持。因此,这个库中唯一的舍入模式是默认的四舍五入到偶数

目标

  • 函数应该忠实于舍入(误差 < 1 ulp)。
  • 函数应该和系统库一样快。
  • 尽量让f32函数比系统库更快。
  • 避免查找表以减少内存使用,尤其是在WebAssembly上。
    • 这个目标不如其他目标重要。例如,为了实现忠实的舍入,三角函数需要查找表。有关更多详细信息,请参阅Payne–Hanek reduction

非目标

  • 我跳过了舍入函数,如rintroundtrunc,因为

里程碑

  • <math.h>中的真实f32/float函数
    • 指数函数
    • 以常数为基础的对数
    • 任意底数的幂和对数
    • 三角函数和双曲函数
    • 其他初等函数
    • 非初等函数(可选)
  • <complex.h>中的复数f32/float函数
  • <math.h>中的真实f64/double函数
  • <complex.h>中的复数f64/double函数

依赖关系

~180KB