【问题标题】:Range reduction for trigonometric functions三角函数的范围缩减
【发布时间】:2012-08-10 14:20:51
【问题描述】:

我正在尝试为三角函数实现范围缩减。 我发现这篇论文http://www.computer.org/csdl/proceedings/pcspa/2010/4180/00/4180b048-abs.html 谈到了使用 64 位整数运算。

提出的想法应该可行,但论文中的方程式似乎存在一些问题。 这比 fdlibm 中实现的效率高吗?

【问题讨论】:

  • 您说“论文中的方程式似乎有些问题”——它们是什么问题?
  • 我无法阅读链接中引用的论文;它在付费墙后面。你能改写问题,让其他(非学术)人有可能回答你的问题吗?

标签: algorithm math trigonometry


【解决方案1】:

如果您要执行完整的浮点范围缩减,请咨询 K.C. Ng 的“针对大论点的论点简化:坚持到底”在网络上很容易找到。

突出的问题是,要对标准三角函数(例如 sine(x),其中 x 以弧度表示)进行范围缩减,必须执行涉及 Pi 的精确 mod 操作。 mod 需要将 4/Pi 扩展到足够多的派系位位置以获得有意义的结果。本文详细介绍了该过程以及需要走多远。事实证明,它可能是 100 位,但不是数百万位。可能您知道这个问题,但如果没有,您需要知道使用 64 位例程或其他方式进行 good 缩减。

【讨论】:

  • 在哪些非人为的情况下“超精确”三角函数范围缩减实际上有用?当然,在我看到的三角函数的大多数用例中,参数的计算需要乘以分数 884279719003555/281474976710656(最接近 double 到 π)或使用该分数计算的其他值。如果使用 Math.PI 执行参数缩减,则像 Math.sin(Math.PI/180.0*x) 这样的表达式将报告 180° 的起因为零;使用 π 减少参数并不能提高精度。
  • ARGUMENT REDUCTION FOR HUGE ARGUMENTS: Good to the Last Bit 中提出的“超精确”三角范围缩减的一个理由是精度需求不是 由诸如sine(double x) 之类的实现函数所知。使用诸如sqrt() 之类的函数的代码,不要指望许多 ULP 关闭的答案,而是可能的最佳答案。与sine() 一样,所讨论的方法提供了一种在x 的整个范围内提供高精度的方法。大多数应用程序不需要这个。论文讨论比较理性,建议阅读以获得更好的答案。
  • @supercat "如果使用 Math.PI 执行参数缩减,则类似 Math.sin(Math.PI/180.0*x) 的表达式将报告 180° 的自(原文如此)为零":True。但这不是最好的答案,因为Math.sin(Math.PI) 不是 0.0。例如sin(3.14159265358979311600 /* Math.PI on my system */ ) --> 1.224647e-161.224647e-16 在绝对值上与 0.0 相差很小,但作为 FP,它通常呈对数分布,它无限好于 0.0。
  • 如果sin 的参数的计算是通过将某些东西乘以一个应该[但不能]等于 π 的常数来计算的,如果使用执行范围缩小,将获得最佳精度无论 π 的值是什么,都被认为是乘法。鉴于 8087 有一条指令可以加载一个精确到 64 位的 π 值的寄存器,它使用该 64 位值执行范围缩小。当与将一个值乘以 pi 的 52 位近似值的代码一起使用时,可以通过对该值执行范围缩小来获得最佳精度。
  • Math.Sin(180.0 * (Math.Pi/180.0)) 不为零这一事实应归类为可容忍的怪癖而不是特征,因为 180° 的正弦不是 1.224647e-16,但应该精确 零。此外,除非代码碰巧知道 sine 的参数表示一个精确值,而不是 +/- 0.00000000000000001%(ulp 的 1/1000),否则 sin(x) 的任何报告值都在0.9999999999999999999x 和 1.0000000000000000001x 应该被认为和其他的一样好。除非参数是使用 Kahan 求和计算的......
猜你喜欢
  • 2017-11-13
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 2014-09-08
相关资源
最近更新 更多