没有 math.h 的 sin & cos 函数

新手上路,请多包涵

由于 PS3 3.40 SDK 引起的某些编译器问题,我无法使用 c++ 函数 sin()cos()sin() & cos() 的计算是什么,所以我可以在不需要 math.h 的情况下使用函数?

到目前为止,我已经想出了这些,但它们似乎无法正常运行?

 float sin(float deg) {
    bool neg = false;
    while (deg >= 360) deg = deg - 360;
    while (deg < 0) deg = deg + 360;
    if (deg > 180) {
        deg = deg - 180;
        neg = true;
    }
    float ret = (float)(4*deg*(180-deg))/(40500-(deg*(180-deg)));
    if (neg)return ret*-1;
    return ret;
}

float cos(float AnglesDeg)
{
 float AnglesRad = DegreesToRadians(AnglesDeg);
 float Rad = (float)(PI/2.0f)-AnglesRad;
 float ang = RadiansToDegrees(Rad);
    return sin(ang);
}

原文由 JeffCoderr 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 792
1 个回答

您可以使用泰勒级数自行实现。代码很简单:

 float sine(int deg) {
    deg %= 360; // make it less than 360
    float rad = deg * PI / 180;
    float sin = 0;

    int i;
    for(i = 0; i < TERMS; i++) { // That's Taylor series!!
        sin += power(-1, i) * power(rad, 2 * i + 1) / fact(2 * i + 1);
    }
    return sin;
}

float cosine(int deg) {
    deg %= 360; // make it less than 360
    float rad = deg * PI / 180;
    float cos = 0;

    int i;
    for(i = 0; i < TERMS; i++) { // That's also Taylor series!!
        cos += power(-1, i) * power(rad, 2 * i) / fact(2 * i);
    }
    return cos;
}

正如你所说,你没有 math.h,我为这个算法做了一个简单的幂函数。您还需要一个函数来计算阶乘数。他们来了:

 float power(float base, int exp) {
    if(exp < 0) {
        if(base == 0)
            return -0; // Error!!
        return 1 / (base * power(base, (-exp) - 1));
    }
    if(exp == 0)
        return 1;
    if(exp == 1)
        return base;
    return base * power(base, exp - 1);
}

int fact(int n) {
    return n <= 0 ? 1 : n * fact(n-1);
}

PI 和 TERMS 只是我使用的预处理器指令( #define 的),PI 3.14159(在我的情况下,我使用了 50 位精度的 pi,这是完全没有必要的)和 TERMS 为 7。

原文由 Carlos Afonso 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题