7

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

在将参数传递给以弧度表示的相应函数之前将参数乘以是M_PI/180.0行不通的,因为M_PI/180.0不是 π/180。Handbook of Floating-Point Arithmetic 的第 5.5 节提供了一种计算参数正确舍入乘积 π/180 的方法,但有些参数仍然会使得该乘积接近两个连续可表示浮点数之间的中点,然后即使在弧度中应用正确舍入的函数也会产生错误的最终结果。

可以单独或组合使用的两种策略是使用更高的精度和使用来自CRlibm的三角函数sinpi,它们分别计算和和。cospitanpisin(πx)cos(πx)tan(πx)

对于后一种策略,仍然存在除以 180 的问题,这对于许多论点来说并不准确。

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

4

4 回答 4

3

唯一有理数qcosdeg(360q)分母为 1、2、3、4 或 6。 Joerg Jahnel 的这篇论文在第 6 节中包含了一个使用场论的简短而漂亮的证明。(实际上,作者使用欧拉的 totient 函数来表征代数数的次数。)所以不存在介于两个相邻的中间的cosdeg(360q)浮点数浮点数字。qcosdeg(360q)

所以我想答案是“与您实现sin弧度和朋友的方式大致相同”,尽管@gnasher729 提出了一个很好的观点,即度数的参数减少要好得多。

于 2014-08-03T15:30:35.430 回答
2

它很难。从积极的方面来说,您可以将参数精确地减小到 +/- 45 度。因此,您需要在 +/- 45 度之间正确舍入结果。对于非常小的 x,sin (x) 大约是 x * (pi / 180),这很难精确地四舍五入。

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

于 2014-08-03T15:06:17.423 回答
1

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

  • 输出需要什么精度?它是 IEEE 754 单精度或双精度还是非标准?此外,我假设输入,即以度表示的输入,应该以与输出相同的精度表示,因为这是正常弧度输入的情况。
  • 你的绩效指标是什么?CRlibm 经过优化以产生正确舍入的双精度结果。另一方面,MPFR 用于任意精度,但当您只需要双精度输出时,它比 CRlibm 慢得多。
  • 你的工作范围是多少?即[最小参数,最大参数]?这对 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. 将结果四舍五入到目标精度。

Muller 的“基本函数”从统计上表明,如果工作精度略大于目标精度的两倍,则大多数(不是所有)困难情况都会正确舍入。但是在您的情况下,由于输入在理论上是超越的,为了安全起见,以牺牲性能为代价,使工作精度远高于目标。实际上,如果您需要高达双精度的最终结果,对于几乎 100% 的情况,10 倍是完全足够的。

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

于 2014-08-03T22:39:02.230 回答
1

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

  • 根据我的博士论文第 4.3 节所述,根据 Nesterenko 和 Waldschmidt 定理获得一个界限(顺便说一句,我认为这也会为您提供确切案例的形式)。但是你会得到非常大的精度界限(至少几百万位?)。
  • 找到最难圆的箱子。在 [0,180] 中进行搜索就足够了,因为任何较大的参数都将减少为具有相同小数部分的 [0,180] 中的值(因为句点是整数)。
于 2014-08-06T00:12:47.993 回答