Floating point 如何正确计算以度为单位的四舍五入三角函数?
我如何定义以度而不是通常的弧度为参数的三角函数,并为这些参数计算正确的四舍五入结果 将参数乘以Floating point 如何正确计算以度为单位的四舍五入三角函数?,floating-point,trigonometry,degrees,elementary-functions,Floating Point,Trigonometry,Degrees,Elementary Functions,我如何定义以度而不是通常的弧度为参数的三角函数,并为这些参数计算正确的四舍五入结果 将参数乘以M_PI/180.0,然后再将其传递给相应的函数(以弧度为单位),这样做不起作用,因为M_PI/180.0不是π/180。《浮点运算手册》第5.5节提供了一种计算参数的正确四舍五入乘积π/180的方法,但有些参数仍然会使该乘积接近两个连续可表示浮点之间的中点,然后,即使应用弧度中正确的四舍五入函数,也会产生错误的最终结果 两种可能单独或组合工作的策略是使用更高的精度,并使用分别计算sin(πx),cos
M_PI/180.0
,然后再将其传递给相应的函数(以弧度为单位),这样做不起作用,因为M_PI/180.0
不是π/180。《浮点运算手册》第5.5节提供了一种计算参数的正确四舍五入乘积π/180的方法,但有些参数仍然会使该乘积接近两个连续可表示浮点之间的中点,然后,即使应用弧度中正确的四舍五入函数,也会产生错误的最终结果
两种可能单独或组合工作的策略是使用更高的精度,并使用分别计算sin(πx),cospi
,tanpi
三角函数的sin(πx)
,cos(πx)
和tan(πx)
对于后一种策略,仍然存在除以180的问题,这对于许多论点来说并不准确
关于更高精度策略(将参数乘以π/180的扩展精度表示,然后应用弧度的扩展精度函数),在“精确”情况下可能仍然存在问题。该定理表明,在
0
中,有理参数的sin
、cos
和tan
的唯一有理结果仅适用于弧度版本。它显然不适用于度数版本,如果对于某些浮点输入x,sindeg(x)正好是两个连续可表示的浮点数之间的中点,那么中间精度不足以保证最终结果正确舍入。这很困难。从积极的一面来看,您可以将参数精确地减少到+/-45度。因此,您需要在+/-45度之间正确舍入结果。对于非常小的x,sin(x)约为x*(π/180),其硬度足以精确地四舍五入
例如,为了获得正弦函数的最正确的四舍五入结果,取-45唯一的有理数
q
,其中cosdeg(360q)
是有理数,其分母为1、2、3、4或6。Joerg Jahnel在第6节用场论给出了一个简短而漂亮的证明。(事实上,作者使用Euler的toticent函数描述了代数数cosdeg(360q)
的阶数。)因此不存在浮点q
,因此cosdeg(360q)
位于两个相邻浮点数的中间
所以我猜答案是“与你实现sin和friends的方法大致相同”,尽管@gnasher729提出了一个很好的观点,即度的参数化简要好得多。这是一个很难回答的问题。让我澄清几点:
- 输出所需的精度是多少?是IEEE 754单精度还是双精度还是非标准?此外,我假设输入,即以度表示的输入,应以与输出相同的精度表示,因为这是正常弧度输入的情况
- 你的绩效指标是什么?CRlibm经过优化以产生正确的四舍五入双精度结果。另一方面,MPFR用于任意精度,但当您只需要双精度输出时,它比CRlibm慢得多
- 你的工作范围是什么?i、 e.[最小参数,最大参数]?这对CRlibm很重要,因为它适用于双精度范围。然而,这对MPFR来说并不重要
如果您需要低精度,即单精度或更低精度,可以进行详尽的测试,以确定最低的工作精度,从而正确地四舍五入所有案例。您首先需要检测准确的案例,这已经得到了回答。现在,对于其他情况,有一个众所周知的问题,那就是桌子制造商的困境。如果您的算术具有固定(且较小)精度,并且您希望在可能需要的中间精度上有一个经过认证的界限,则有两种已知的解决方案:
- 根据Nesterenko和Waldschmidt定理获得一个界,如我的博士论文第4.3节所述(顺便说一句,我想这也会给出确切情况的形式)。日分