如何以度为单位计算正确的三角函数?

时间:2014-08-03 13:01:55

标签: floating-point trigonometry degrees elementary-functions

如何定义以度为单位而不是通常的弧度的参数的三角函数,并为这些参数计算正确的舍入结果?

将参数乘以M_PI/180.0,然后将其传递给弧度中的相应函数不起作用,因为M_PI/180.0不是π/ 180。 “浮点运算手册”的第5.5节提供了一种方法来计算参数的正确舍入乘积π/ 180,但是一些参数仍然是这样的,即该乘积接近两个连续可表示浮点数之间的中点,然后在弧度中应用甚至正确舍入的函数可能会产生错误的最终结果。

可以单独或组合使用的两种策略使用更高的精度并使用CRlibm中的sinpicospitanpi三角函数,分别计算{{ 1}},sin(πx)cos(πx)

对于后一种策略,仍然存在180分割的问题,这对于许多论证来说并不完全。

关于更高精度的策略(将参数乘以π/ 180的扩展精度表示,然后在弧度中应用扩展精度函数),“精确”情况可能仍然存在问题。在tan(πx)中获得理性参数sincostan的唯一理性结果的定理仅适用于弧度版本。它显然不适用于度数版本,如果对于某些浮点输入x,sindeg(x)恰好是两个连续可表示的浮点数之间的中点,那么没有多少中间精度足以保证最终结果是正确的舍入。

4 个答案:

答案 0 :(得分:3)

q合理的唯一理性cosdeg(360q)以1,2,3,4或6为分母。 Joerg Jahnel的This paper在第6节中使用场论进行了简短而美观的证明。(实际上,作者使用欧拉的函数来表征代数数cosdeg(360q)的程度。)因此,没有浮动 - 指向q,使cosdeg(360q)位于两个相邻浮点数之间。

所以我猜答案是“关于你实现sin和朋友们实现弧度的方式相同”,尽管@ gnasher729提出了一个很好的观点,即度数的参数减少更多,更好。

答案 1 :(得分:1)

这很难。从积极的方面来说,你可以将参数精确地减少到+/- 45度。因此,您需要在+/- 45度之间正确舍入结果。对于非常小的x,sin(x)约为x *(pi / 180),其足够硬以完全圆化。

为了得到正弦函数的大多数正确舍入结果,例如,取-45< = x< = 45.将x分成xhi = round(512 x)/ 512和xlo = x - xhi。设罪(x度)≈ax - bx ^ 3。舍入a和b,以便精确计算s(x)a * xhi - b *(xhi ^ 3)。仔细计算余数sin(x度) - s(x);舍入误差应该非常小,因为结果很小。添加到s(x),这将在大多数情况下给出正确的舍入结果。

答案 2 :(得分:1)

嗯,这是一个很难的问题。让我澄清一些观点:

  • 输出需要什么精度?是IEEE 754单精度还是双精度还是非标准?此外,我假设,输入,即以度表示的输入,应以与输出相同的精度表示,因为正常的弧度输入就是这种情况。
  • 您的效果指标是什么? CRlibm经过优化,可生成正确的舍入双精度结果。另一方面,MPFR用于任意精度,但是当你只需要双精度输出时它比CRlibm慢得多。
  • 你的工作范围是多少?即[min argument,max argmunet]?这对CRlibm很重要,因为它适用于双精度范围。但是,MPFR并不重要。

如果您有义务仅以度数使用输入,我基本上建议使用MPFR。让我提醒你,任何以度为单位的论证,当它乘以(Pi / 180)时,它会产生一个超越数。但是,传递给三角函数的是浮点表示舍入,最好是舍入到最接近的整数,达到工作精度。

我建议你这样做:

  1. 使用MPFR,尽可能使用C库,因为它提供了比绑定更好的性能。
  2. 将MPFR精度设置为远高于目标精度。例如(目标精度+ 300)。通过这样做,可以避免操作的任何精度损失((Argument * Pi)/ 180)。 这可以通过mpfr_set_default_prec()在MPFR C库中轻松完成。
  3. 执行操作:X_n =(Argument * Pi)/ 180,然后执行Sin(X_n)或您想要的任何功能。 MPFR中有一个常量Pi,表示在您的工作精度内
  4. 将结果舍入到目标精度。
  5. 穆勒的“基本功能”在统计上显示,如果工作精度稍微大于目标精度的两倍,则大多数(而非全部)硬壳都会被正确舍入。但在你的情况下,由于输入在理论上是超越的,为了安全,以牺牲性能为代价,使工作精度远高于目标。实际上,如果你需要最多双精度的最终结果,10x对于几乎100%的情况是完全足够的。

    如果您需要低精度,即单精度或更低精度,则可以进行详尽的测试,以确定最低工作精度,从而使所有情况都正确舍入。

答案 3 :(得分:1)

您首先需要检测确切的案例,这已经得到了解答。现在,对于其他情况,桌面制造商的困境是众所周知的问题。如果您的算术具有固定(和小)精度,并且您希望获得可能需要的中间精度的认证界限,则有两种已知解决方案:

  • 根据Nesterenko和Waldschmidt的定理获得一个界限,如我博士论文的第4.3节所述(顺便说一句,我认为这也会给你确切案例的形式)。但是你会得到非常大的精度界限(至少几百万位?)。
  • 找到最难对付的案例。在[0,180]中进行搜索就足够了,因为任何较大的参数都将减少到[0,180]中的值,而相同的小数部分(因为周期是整数)。