这个余弦16位功能究竟在做什么?

时间:2013-02-05 17:39:19

标签: c++ cosine

我想我在审查其他人的代码方面相当不错......但我很茫然。这来自Doom3 Math库。我相信自从Quake 1以来,这可能存在于GPL中。请注意,这确实引用了math.h.我猜有一些方法,这实际上计算余弦......但我无法弄明白。有人解释一下吗?

    ID_INLINE float idMath::Cos16( float a ) {
    float s, d;

    if ( ( a < 0.0f ) || ( a >= TWO_PI ) ) {
        a -= floorf( a / TWO_PI ) * TWO_PI;
    }
#if 1
    if ( a < PI ) {
        if ( a > HALF_PI ) {
            a = PI - a;
            d = -1.0f;
        } else {
            d = 1.0f;
        }
    } else {
        if ( a > PI + HALF_PI ) {
            a = a - TWO_PI;
            d = 1.0f;
        } else {
            a = PI - a;
            d = -1.0f;
        }
    }
#else
    a = PI - a;
    if ( fabs( a ) >= HALF_PI ) {
        a = ( ( a < 0.0f ) ? -PI : PI ) - a;
        d = 1.0f;
    } else {
        d = -1.0f;
    }
#endif
    s = a * a;
    return d * ( ( ( ( ( -2.605e-07f * s + 2.47609e-05f ) * s - 1.3888397e-03f ) * s + 4.16666418e-02f ) * s - 4.999999963e-01f ) * s + 1.0f );
}

1 个答案:

答案 0 :(得分:5)

所有有条件的东西看起来都是将角度折叠到一个象限(或者可能是八分圆,我不能打算弄清楚......;)),并记录一个修正因子({{1} })。

最后一行是执行某种10阶多项式逼近(可能TaylorChebyshev?)。 * 但它只适用于偶数幂,如{ {1}}是一个偶数函数。它还使用Horner's method来避免多次直接计算大功率。

然后使用d重新应用正确的符号。

<小时/> *要看到这“非常”准确,请尝试在Octave中运行以下代码(您可以在线进行,例如here):

cos