By Long Luo
之前写过一篇介绍 CORDIC 算法 的文章,里面提到 CORDIC 算法的 不足 之处,CORDIC 算法的输入角度范围需要在 [−99.88∘,99.88∘] ,那么我们不禁要问,如果输入角度 θ 很大的话,怎么处理呢?
这个问题同样存在于 泰勒展开式(Taylor series) 中,比如 sin(x) 和 cos(x) 的泰勒展开式:
sin(x)=x−3!1x3+5!1x5−7!1x7+9!1x9+o(x9)∀x⊂R
cos(x)=1−2!1x2+4!1x4−6!1x6+8!1x8+o(x8)∀x⊂R
虽然在整个实数集 R 都成立,但是在实际应用中因为展开项数限制和浮点数的精度限制, x 的范围只有在接近 0 的时候才有比较高的精度。
但是实际应用中,如果输入 x 很大的话,比如 232,1010,1022… 情况下怎么得到足够精确的值呢?
中学里我们知道三角函数是周期函数,对于比较大的值,我们可以使用下面的公式将值归约到一个比较小的范围内。
x′=x−2kπk⊂Z
这就是我们今天要讲的 参数归约(Argument Reduction) 算法。
从小学计算题开始
参数归约 听起来就很唬人,什么是参数啊,什么归约啊,都是些高大上的名词,听起来云里雾里的!
为了不让大家产生厌倦和畏难心理,我们先从一道小学数学计算题开始:
不借助计算器,计算 66600×666000 的值!
对于这道题,大家可能会列出下列算术:
66600×666000=666×666×100000=44355600000
但其实呢,我们也可以使用下面的方法:
66600×666000=1112×4×9×105=444×999×105=444×(1000−1)×105=4443556×105
如果我说上面这 2 种方法都用到了参数归约的思想,你可能会感到震惊,什么?这种小学计算题也用到了参数归约算法吗?