10个版本
新版本 0.1.1 | 2024年8月18日 |
---|---|
0.1.0 | 2024年8月17日 |
0.0.6 | 2024年8月13日 |
191 在 数学 类别中
每月 876 次下载
55KB
601 代码行
metallic
一个快速的、正确舍入的Rust数学库!
这个库是我的C库Metallic的后续版本,该库从2017年开始为WebAssembly开发。最被期望的功能最终证明是我从头编写的数学函数,所以我决定用Rust重写它们。
启用 融合乘加操作 以获得最佳性能!
如果可用,此crate广泛使用融合乘加指令。遗憾的是,Rust在默认的generic
目标中未启用它。为了获得最佳性能,请将以下内容添加到您的.cargo/config.toml
中,无论是您的项目还是主目录
[build]
rustflags = ["-Ctarget-cpu=native"]
假设
C库往往对数学函数有严格而陈旧的假设。例如,float
函数不敢使用double
指令,因为担心主机不支持。在这个库中,我假设所有Rust原始类型都符合IEEE 754标准,并且是主机本地的。换句话说,我假设以下指令可用于浮点类型
- 加法、减法、乘法、除法
- 平方根 (
f32::sqrt
) - 融合乘加 (
f32::mul_add
) - 舍入指令,如
f32::trunc
除了四个基本算术运算之外的其他假设,导致了对Rust标准库的依赖。
此外,我忽略了Rust中没有的浮点环境。在C和C++中,它也大多未使用,因为它需要#pragma STDC FENV_ACCESS ON
和编译器支持。因此,这个库中唯一的舍入模式是默认的四舍五入到偶数。
目标
- 函数应该忠实于舍入(误差 < 1 ulp)。
- 函数应该和系统库一样快。
- 尽量让
f32
函数比系统库更快。 - 避免查找表以减少内存使用,尤其是在WebAssembly上。
- 这个目标不如其他目标重要。例如,为了实现忠实的舍入,三角函数需要查找表。有关更多详细信息,请参阅Payne–Hanek reduction。
非目标
- 我跳过了舍入函数,如
rint
、round
和trunc
,因为- 在现代CPU上,它们可能只占用一条指令。
- Rust已经提供了
f32::round_ties_even
、f32::round
、f32::trunc
等。 - 它们的软件实现速度慢且繁琐,与
fabs
不同。
里程碑
<math.h>
中的真实f32
/float
函数- 指数函数
- 以常数为基础的对数
- 任意底数的幂和对数
- 三角函数和双曲函数
- 其他初等函数
- 非初等函数(可选)
<complex.h>
中的复数f32
/float
函数<math.h>
中的真实f64
/double
函数<complex.h>
中的复数f64
/double
函数
依赖关系
~180KB