罪与罪没有math.h的cos函数

时间:2016-08-12 12:12:38

标签: c++ math 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);
}

3 个答案:

答案 0 :(得分:3)

如果你真的需要自己实现sin和cos函数,你应该使用taylor系列sin x = x - x^3/3! + x^5/5! -x^7/7! ..cos x = 1 -x^2/2!+x^4/4!-x^6/6! ..,其中n!是n n!=1*2*3*..*(n-1)*n的阶乘。下面是一个相当强大的实现。它使用度数作为输入,因为我认为原始海报不像标准函数那样需要弧度。

#include <iostream>

const double PI=3.1415926535897932384650288;

double sin(double x){
  double sign=1;
  if (x<0){
    sign=-1.0;
    x=-x;
  }
  if (x>360) x -= int(x/360)*360;
  x*=PI/180.0;
  double res=0;
  double term=x;
  int k=1;
  while (res+term!=res){
    res+=term;
    k+=2;
    term*=-x*x/k/(k-1);
  }

  return sign*res;
}

double cos(double x){
  if (x<0) x=-x;
  if (x>360) x -= int(x/360)*360;
  x*=PI/180.0;
  double res=0;
  double term=1;
  int k=0;
  while (res+term!=res){
    res+=term;
    k+=2;
    term*=-x*x/k/(k-1);
  }  
  return res;
}

int main(){
  double c = cos(1231);
  double s = sin(1231);
  std::cout << "cos(1231) = " << c << ", sin(1231) =  " << s << " sin^2+cos^2=" << c*c+s*s << " (should be 1)" << std::endl;
}

答案 1 :(得分:3)

您可以使用Taylor Series自行实现此功能。代码很简单:

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,我为这个算法做了一个简单的幂函数。您还需要一个计算阶乘nubmers的函数。他们在这里:

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。

答案 2 :(得分:2)

我非常确定您的协处理器具有sincos操作,您可以使用Assembler调用它们,例如:

double mycos(double)
{
  __asm
  {
    fld qword ptr[ebp + 8]
    fcos
  }
}

double mysin(double)
{
  __asm
  {
    fld qword ptr[ebp + 8]
    fsin
  }
}

但请注意,此方法不安全且无法移植,因此使用stdlib解决问题要好得多。