如何定义以度为单位而不是通常的弧度的参数的三角函数,并为这些参数计算正确的舍入结果?
将参数乘以M_PI/180.0
,然后将其传递给弧度中的相应函数不起作用,因为M_PI/180.0
不是π/ 180。 “浮点运算手册”的第5.5节提供了一种方法来计算参数的正确舍入乘积π/ 180,但是一些参数仍然是这样的,即该乘积接近两个连续可表示浮点数之间的中点,然后在弧度中应用甚至正确舍入的函数可能会产生错误的最终结果。
可以单独或组合使用的两种策略使用更高的精度并使用CRlibm中的sinpi
,cospi
,tanpi
三角函数,分别计算{{ 1}},sin(πx)
和cos(πx)
。
对于后一种策略,仍然存在180分割的问题,这对于许多论证来说并不完全。
关于更高精度的策略(将参数乘以π/ 180的扩展精度表示,然后在弧度中应用扩展精度函数),“精确”情况可能仍然存在问题。在tan(πx)
中获得理性参数sin
,cos
和tan
的唯一理性结果的定理仅适用于弧度版本。它显然不适用于度数版本,如果对于某些浮点输入x,sindeg(x)恰好是两个连续可表示的浮点数之间的中点,那么没有多少中间精度足以保证最终结果是正确的舍入。
答案 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)
嗯,这是一个很难的问题。让我澄清一些观点:
如果您有义务仅以度数使用输入,我基本上建议使用MPFR。让我提醒你,任何以度为单位的论证,当它乘以(Pi / 180)时,它会产生一个超越数。但是,传递给三角函数的是浮点表示舍入,最好是舍入到最接近的整数,达到工作精度。
我建议你这样做:
如果您需要低精度,即单精度或更低精度,则可以进行详尽的测试,以确定最低工作精度,从而使所有情况都正确舍入。
答案 3 :(得分:1)
您首先需要检测确切的案例,这已经得到了解答。现在,对于其他情况,桌面制造商的困境是众所周知的问题。如果您的算术具有固定(和小)精度,并且您希望获得可能需要的中间精度的认证界限,则有两种已知解决方案: