计算三角函数需要多少次算术运算?

How many arithmetic operations should it take to calculate trig functions?

提问人:rwallace 提问时间:12/2/2022 更新时间:12/3/2022 访问量:121

问:

我正在尝试评估计算三角函数的预期性能,作为所需精度的函数。显然,挂钟时间取决于基础算术的速度,因此只需计算运算次数即可将其分解:

使用最先进的算法,应该进行多少次算术运算(加、减、乘、除)来计算,作为输出中所需的精度位数(或十进制数字)的函数?sin(x)

数学 三角函数 浮点精度

评论

0赞 rwallace 12/2/2022
@EricPostpischil 是的,我问的是多精度计算的情况。
1赞 chtz 12/2/2022
对于多精度算术,我建议看一下 MPFR 算法: mpfr.org/algorithms.pdf
2赞 njuffa 12/2/2022
@rwallace:Fredrik Johansson,“中等精度范围内基本函数的高效实现”,2015 年第 22 届 IEEE 计算机算术研讨会,指出了 sin(x)、cos(x) 的相对成本大致如下:IEEE-754 双精度(53 位 FP):1x,128 位 FP:10x,512 位 FP:50x,2048 位 FP:500x。执行的指令数量将大致按相同的因素增长。渐近地,基本先验函数(包括正弦)的复杂度为 O(M(n)*log²(n)),其中 M(n) 是乘法的复杂度,其中 n*log(n) <= M(n) <= n**(1.58) [Karatsuba]。
2赞 njuffa 12/2/2022
@rwallace 在参数的路径上,在运输数学库中 DP sin() 的计数指令 |x|< 2**31,我数了 35 条指令:14 条整数指令、13 条 FP64 FMA、6 个 64 位负载、1 个 FP64 比较、1 个分支。请注意,根据 ISA,此类统计数据可能会有很大差异。

答:

3赞 chux - Reinstate Monica 12/2/2022 #1

...评估计算三角函数的预期性能作为所需精度的函数。

泰勒级数正弦值中第一个省略的项视为误差顺序。x = π/4


细节:通常有以下几个阶段:sin(x)

  1. 处理特殊情况:NaN、无穷大。

  2. 参数简化到主要范围,表示 [-π/4...+π/4]。真正的好减少是困难的,因为π是非理性的,因此涉及达到 50% 时间的代码。模拟所需的扩展精度需要花费大量时间。(研究 K.C. Ng 的“ARGUMENT REDUCTION FOR HUGE ARGUMENTS: Good to the Last Bit”
    低质量还原涉及的要少得多:, truncate, , .
    sin()/-*

  3. 在有限范围内进行计算。这是许多人只考虑的。如果使用泰勒级数完成并且需要 53 位,那么大约需要 10-11 项:泰勒级数正弦。然而,质量代码通常使用一对精心设计的多项式,每个多项式大约有 4-5 项,以形成商 p(x)/q(x)。

  • 当然,这些步骤中的任何一个都提供专用硬件支持,大大提高了性能。

  • 注意:代码 for 通常与代码配对,因为大量使用 trig 恒等式可以简化计算。sin()cos()

我希望软件解决方案的成本是普通的 25 倍。这是一个粗略的估计。sin()*

为了在 ULP 中实现非常低的错误率,代码通常会使用更多。 只需几个条款就可以过得去。因此,在评估时间性能时,需要权衡正确性。你想要多好?sine_crap()sin()


0赞 chux - Reinstate Monica 12/3/2022 #2

评估计算三角函数的预期性能作为所需精度的函数

使用泰勒级数作为运算次数、最坏情况 (45°) 和序列最后一项顺序计算误差的预测因子:x = π/4

sin() Taylor's series

sin() Terms needed per Bits of precision

对于 32 位,需要订购 6 个操作。
对于 64 位,需要订购 9 个操作。
floatfloatdoublefloat

因此,如果时间按 FP 宽度的平方缩放,预计需要 6 倍的时间。double9/6*2*2