如何定义以度为单位而非弧度为参数,并计算出这些参数的正确舍入结果的三角函数?
在将参数传递给弧度中相应的函数之前,将参数乘以M_PI/180.0
并不起作用,因为M_PI/180.0
不是π/180。《浮点运算手册》第5.5节提供了一种计算参数与π/180的正确舍入积的方法,但某些参数仍可能使得该积接近两个连续可表示浮点数的中间值,然后即使在弧度中应用正确舍入的函数也可能产生错误的最终结果。
两种可能有效的策略是使用更高精度和使用CRlibm中的sinpi
、cospi
、tanpi
三角函数,它们分别计算sin(πx)
、cos(πx)
和tan(πx)
。
sin
、cos
和tan
的唯一有理结果仅在0
中获得,这显然不适用于角度版本,如果对于某些浮点输入x,sindeg(x)恰好处于两个连续可表示浮点数的中点,则无论中间精度如何都不能保证最终结果正确舍入。
sindeg
没有非平凡精确情况的结果不应该是“不存在浮点数q
,使得sindeg(q
)恰好处于两个相邻浮点数之间”吗? - Pascal Cuoqsindeg(q)
或cosdeg(q)
的唯一有理q
是30度的倍数,答案总是无理数或1/2的倍数。这比您需要的结果更强,因为每个浮点数和每个中间浮点数都是有理数。 - tmyklebu