【问题标题】:Is there any advantage to restraining the angle passed to trigonometric functions?限制传递给三角函数的角度有什么好处吗?
【发布时间】:2011-09-07 15:12:19
【问题描述】:

我想知道在0Math.PI * 2 之间限制传递给三角函数的角度是否有任何优势?我有一个大量使用三角函数的函数,项目中的某个人将其添加到了开头:

angle %= Math.PI * 2;

这样做有什么好处吗?如果传递的角度在这些值之间,三角函数会更快吗?如果是这样,他们不应该自己夹住它吗?是否还有其他需要对等角进行钳位的情况?

语言是 JavaScript,最有可能在 V8 和 SpiderMonkey 上运行。

【问题讨论】:

  • 答案将取决于您使用的平台。您使用什么语言/框架/编译器/等?我怀疑它在性能方面并不重要,但它可能会使调试变得容易得多。

标签: javascript math optimization trigonometry


【解决方案1】:

由于大多数(片上)计算三角函数的算法使用CORDIC 的一些变体,我敢打赌,这些值无论如何都会在触发函数调用的入口点被限制在 [0, Pi/2) 内.

话虽如此,如果您有办法在整个算法中保持角度接近于零,那么这样做可能是明智的。事实上,sin(10^42) 的值几乎没有定义,因为 10^42 范围内的粒度约为 10^25。

这意味着例如,如果您要添加角度,并且这样做会使它们的幅度变大,那么您应该考虑定期夹紧它们。但是没有必要在三角函数调用之前将它们钳位。

【讨论】:

  • 我担心你的前提不一定正确。我记得在热点代码库中读到过这个,他们不得不删除对 sin/cos 计算的优化,因为 x86 CPU(以及 x87 协处理器)没有为 PI 或其他东西使用足够高的精度。编辑:在此处查看this
  • @Voo:感谢您的链接,它确实很有启发性。然而,即使文章指出在 x86 上 sin(pi) 的值在相对精度方面有很大的偏差,对于大多数参数这实际上转化为机器精度,所以我不会担心由于这个原因,现有代码可能会在 x86 上被破坏。但事实上,这种机器上的论点减少是有缺陷的。我将在现代 x86 计算机上对此进行测试。
  • 我不确定我是否能理解你的论点。如果使用非缩减的输入参数,则会导致输出精确到仅 100 亿 ULP 左右(从线程中窃取)而不是预期的 1/2 或 1,这似乎是有问题的。我的意思是通常我希望sin(2PI * 1000000000 + 1)Sin(1) 的输出“相同” - 不一定完全相同,但仍处于同一范围内。尽管问题是 x87 在今天有多重要 - 是否存在一些 SSE 内在因素?
  • @Voo:“100 亿 ULP”仅适用于 sin(pi)(这使得绝对精度为 10^-15 IIRC)。对于其他数字,绝对准确度是可以的。无论如何,您无法在浮点运算中正确表示 pi。
【解决方案2】:

将角度限制在 -pi/4 到 pi/4 范围内(根据需要使用正弦或余弦)的一个优点是,您可以确保如果使用 pi 的某种近似值计算角度,则使用 相同的近似值。这种方法有两个好处:它将提高诸如 180 度的正弦或 90 度的余弦之类的精度,并且它将避免让数学库浪费计算周期来执行超精确的范围缩小“更精确”的 pi 近似值与计算角度时使用的不匹配。

例如,考虑 2⁴⁸ * pi 的正弦值。 pi 的最佳double 近似值乘以 2^48 是 884279719003555,这恰好也是 2⁴⁸π 的最佳双近似值。 2⁴⁸π 的实际值为 884279719003555.03447074。用 pi 的最佳双近似值对前一个值进行 Mod-reduce 将产生零,其正弦等于 2⁴⁸π 的正确正弦。将由 pi 的最佳近似值按比例放大的值通过 π 进行 Mod 减少将得到 -0.03447074,其正弦值为 -0.03446278。

【讨论】:

    猜你喜欢
    • 2014-09-16
    • 2011-04-10
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2013-11-02
    • 2011-08-16
    相关资源
    最近更新 更多