0
#define PARTPERDEGREE 1
double mysinlut[PARTPERDEGREE * 90 + 1];
double mycoslut[PARTPERDEGREE * 90 + 1];
void MySinCosCreate()
{
    int i;
    double angle, angleinc;

    // Each degree also divided into 10 parts
    angleinc = (M_PI / 180) / PARTPERDEGREE;
    for (i = 0, angle = 0.0; i <= (PARTPERDEGREE * 90 + 1); ++i, angle += angleinc)
    {
        mysinlut[i] = sin(angle);
    }

    angleinc = (M_PI / 180) / PARTPERDEGREE;
    for (i = 0, angle = 0.0; i <= (PARTPERDEGREE * 90 + 1); ++i, angle += angleinc)
    {
        mycoslut[i] = cos(angle);
    }
}


double MySin(double rad)
{
    int ix;
    int sign = 1;
    double angleinc = (M_PI / 180) / PARTPERDEGREE;

    if(rad > (M_PI / 2))
        rad = M_PI / 2 - (rad - M_PI / 2);

    if(rad < -(M_PI / 2))
        rad = -M_PI / 2 - (rad + M_PI / 2);

    if(rad < 0)
    {
        sign = -1;
        rad *= -1;
    }

    ix = (rad * 180) / M_PI * PARTPERDEGREE;
    double h = rad - ix*angleinc;
    return sign*(mysinlut[ix] + h*mycoslut[ix]);
}

double MyCos(double rad)
{
    int ix;
    int sign = 1;
    double angleinc = (M_PI / 180) / PARTPERDEGREE;


    if(rad > M_PI / 2)
    {
        rad = M_PI / 2 - (rad - M_PI / 2);
        sign = -1;
    }
    else if(rad < -(M_PI / 2))
    {
        rad = M_PI / 2 + (rad + M_PI / 2);
        sign = -1;
    }
    else if(rad > -M_PI / 2 && rad < M_PI / 2)
    {   
        rad = abs(rad);
        sign = 1;
    }

    ix = (rad * 180) / M_PI * PARTPERDEGREE;

    double h = rad - ix*angleinc;
    return sign*(mycoslut[ix] - h*mysinlut[ix]);
}

double MyTan(double rad)
{
    return MySin(rad) / MyCos(rad);
}

除算を使用した計算は、元の関数tanよりもさらにコストがかかることがわかりました。tan

tan私のMCUでは除算が高価であるため、除算演算なしでsin/cosルックアップテーブルの値を使用して計算する方法はありますか?

tansin/cos で行われているように、LUT を使用して tan/sin または tan/cos を使用して結果を抽出する方がよいでしょうか?

4

1 に答える 1

0

特にマイクロコントローラーでは、分母1 +-eps = 1 +-x ^(2 ^ n)がゼロになるまで、log&expテーブルまたは反復乗算のいずれかによって除算y/xを最適化できることがよくあります。

y/X = y / (1-x) 
    = (1+x)y / (1+x)(1-x)
    = (1+x)(1+x^2)y / (1-x^2)(1+x^2)
    = (1+x)(1+x^2)(1+x^4)y / (1-x^4)(1+x^4)
于 2012-12-08T10:47:51.867 に答える