2 个版本
0.1.1 | 2024 年 7 月 22 日 |
---|---|
0.1.0 | 2024 年 7 月 21 日 |
#170 in 数学
每月 258 次下载
325KB
3.5K SLoC
确定性三角学
该库提供基本的三角函数,不使用任何浮点运算。
该库旨在为使用同步确定性的游戏提供帮助,因此希望避免在不同硬件或编译器使用浮点运算时带来的不确定性。该库通过仅使用内部整数数据类型来避免这些微小的不一致性。因此,无论使用哪个编译器或硬件,该库都应该产生完全可重现的结果。然而,这是以精度损失为代价的,因为累积了舍入误差。(注意:这种不精确性仍然是 100% 一致和可重现的,因此不会破坏确定性。)
通过使用预先烘焙的三角学结果表(直接写入代码并使用 initialize() 函数写入内存)来实现三角学。该库支持正弦、余弦、正切、反正弦、反余弦和反正切。
以一个 (i32, i32) 元组的形式提供输入,对应于分数表示的输入的分子和分母。所有角度测量都以弧度为单位。输出以一个表示分数输出的 (i32,i32) 元组形式返回。输出分母始终为 1000,以便于转换为定点小数。
将库添加到您的 Rust 项目中
cargo add deterministic-trigonometry
基本示例
use deterministic_trigonometry::DTrig;
fn main (){
let d_trig = DTrig::initialize();
let arctangent_of_one_half = d_trig.arctangent((500,1000));
println!("The arctangent of 500/1000 radians is {}/{}.", arctangent_of_one_half.0, arctangent_of_one_half.1);
}
对于更复杂的示例,请参阅源代码中的 examples 文件夹。
函数列表
该库有一个 initialize() 函数,必须在实例化 DTrig 结构体时运行,以及六个三角学和反三角学函数
let d_trig = DTrig::initialize();
let sine_of_one_half = d.trig.sine((500,1000));
let cosine_of_one_half = d.trig.cosine((500,1000));
let tangent_of_one_half = d.trig.tangent((500,1000));
let arcsine_of_one_half = d.trig.arcsine((500,1000));
let arccosine_of_one_half = d.trig.arccosine((500,1000));
let arctangent_of_one_half = d.trig.arctangent((500,1000));
导致库崩溃的情况
- 分母输入为 0 时会崩溃,因为除以 0 是未定义的。
- 当反正弦输入小于 -1 或大于 1 时会崩溃,因为这对于反正弦在数学上是未定义的。
- 当反余弦输入小于 -1 或大于 1 时会崩溃,因为这对于反余弦在数学上是未定义的。
- 如果您的代码需要优雅地处理这些错误,则应在您的代码中实现这一点。
关于正弦、余弦和正切的精度说明
- 对于分母为1000(或1000的倍数)且值在0/1000和6283/1000(0和2π)之间的输入,分数结果总是精确到千分位。
- 对于值大于6283/1000的分数、负分数以及分母不是2的倍数的分数,结果通常精确到千分位,但由于双重舍入,有时可能在一个方向上相差最多1/1000。
- 当双重舍入与在π/2方向上π的倍数的正切函数的渐近线附近非常接近的值结合时,会出现更大的差异。这是因为微小的舍入误差被趋近于正或负无穷大的正切函数的行为放大。在0到2π之间这不是一个问题。
- 如果精度很重要,请检查每个函数的积分测试以验证其精度,或者构建您自己的测试。
关于反正弦、反余弦和反正切精度的说明
- 对于分母中有1000(或1000的倍数)的正弦和余弦的输入,分数结果总是精确到千分位。
- 对于分母不是1000的倍数且输入在-0.9和0.9之间的正弦和余弦,结果可能在一个方向上相差最多2/1000,误差随着接近-0.9和0.9而增加,因为这些函数的图形在这些点变得更陡峭(这放大了舍入误差)。从-1到-0.9和从0.9到1的误差更大。
- 对于分母是1000的倍数且输入在-4000/1000和4000/1000(-4和4)之间的反正切,结果可能在一个方向上相差最多1/1000。否则,结果可能在一个方向上相差最多2/1000。
- 如果精度很重要,请检查每个函数的积分测试以验证其精度,或者构建您自己的测试。
许可
在您选择的许可下
- Apache License,版本2.0(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确表示,否则根据Apache-2.0许可中定义的,您有意提交以包含在作品中并由您定义的任何贡献,都将按上述方式双重许可,无需任何额外条款或条件。