Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Floating point 如何正确计算以度为单位的四舍五入三角函数?_Floating Point_Trigonometry_Degrees_Elementary Functions - Fatal编程技术网

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来说并不重要
我基本上建议使用MPFR,如果您必须只使用度输入。让我提醒你们,任何以度为单位的参数,当它乘以(π/180)时,就会产生一个超越数。然而,传递给三角函数的是四舍五入的浮点表示,最好四舍五入到最接近的整数,以达到工作精度

我建议您采取以下措施:

  • 使用MPFR,尽可能使用C库,因为它提供了比其绑定更好的性能
  • 将MPFR精度设置为远高于目标精度。例如(目标精度+300)。通过这样做,可以避免操作的准确性损失((参数*Pi)/180)。 这可以通过MPFR\u set\u default\u prec()在MPFR C库中轻松完成
  • 执行以下操作:X_n=(参数*Pi)/180,然后执行Sin(X_n)或任何您想要的函数。MPFR中有一个常数Pi,在您的工作精度范围内表示
  • 将结果四舍五入到目标精度
  • Muller的“基本函数”从统计学上表明,如果工作精度略大于目标精度的两倍,则大多数(并非所有)硬案例都正确舍入。但在您的情况下,由于输入在理论上是超越的,为了安全起见,以牺牲性能为代价,使工作精度远远高于目标。事实上,如果您需要高达两倍精度的最终结果,10倍完全足以满足几乎100%的情况


    如果您需要低精度,即单精度或更低精度,可以进行详尽的测试,以确定最低的工作精度,从而正确地四舍五入所有案例。

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

    • 根据Nesterenko和Waldschmidt定理获得一个界,如我的博士论文第4.3节所述(顺便说一句,我想这也会给出确切情况的形式)。日分