2个不稳定版本
0.2.0 | 2020年4月28日 |
---|---|
0.1.0 | 2020年3月31日 |
#12 在 #represent
35KB
723 行
用整数表示角度
文档:https://docs.rs/integer_angles/
use integer_angles::Angle;
assert_eq!(Angle::pi_2().cos::<f64>(), 0.0f64);
以下是,深入浮点数不稳定性和在计算机中表示角度时出现的各种疯狂问题的兔子洞。该库的目的是解决以下问题
- 如果你有多个角度,并将它们相加,你得到的结果应该是完全正确的。
- 如果你将多个角度相加并得到一个完整的圆,那么它应该正好是一个完整的圆。
- 如果你对某个
π
的倍数的角度进行三角运算,你应该得到确切的答案。 - 跟踪0弧度角和
2π
弧度角之间的差异。 - 跟踪角度是从正x轴开始顺时针还是逆时针。
- 不允许用户表示范围在
[-2π,2π]
之外的角度。
这个库实现魔法的方式如下
- 将角度存储为
[0..2**64)
的单位,其中每个单位是圆的1/(2**64)
。 - 这意味着添加和减去角度(带环绕)将始终正确,并且始终在指定范围内。(不再需要范围缩减!)
- 这也意味着你可以在库内部将角度从
u64
转换为i64
,并得到相同的角度。 - 为完整圆设置标志,并允许单位为
0
时表示0
度角。 - 这也意味着,例如,
pi
弧度在这个库中正好等于1<<63
个单位。 - 使用单独的标志来跟踪角度的顺时针/逆时针性。
- 使用新的单位(比标准库更精确)计算正弦/余弦/正切,以解决Chebyshev问题。
- 使用二分搜索(目前)来计算反正弦/反余弦/反正切/反正切2。
注意事项
- 这个库比使用f64慢(计算
cos
慢约10倍。你需要等待整整80纳秒才能得到结果!) - ... 可能还有其他事情。
许可:MIT
依赖项
~4.5MB
~97K SLoC