2016-08-12 2 views
1

Я не могу использовать функции C++ sin() и cos() из-за некоторых проблем компилятора, вызванных PS3 3.40 SDK. Каковы расчеты sin() & cos(), поэтому я могу использовать функции без необходимости math.h?sin & cos funcs без 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); 
} 
+10

* Поэтому я не могу использовать функции C++ sin() и cos() из-за определенных проблем с компилятором. * Что такое «проблемы компилятора»? – Borgleader

+5

Можете ли вы включить 'cmath'? – Nishant

+0

'sin()' и 'cos()' являются частью [stdlib] (https://en.wikipedia.org/wiki/C_mathematics_functions), поэтому вы можете их использовать, попробуйте исправить ошибки компиляции , если вы не можете, то добавьте их в свой вопрос, чтобы обратиться за помощью в этом отношении. – A4L

ответ

1

Я уверен, что ваш сопроцессор имеет sin и cos операции, и вы можете вызвать их с помощью Ассемблер, что-то вроде:

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

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

Но, пожалуйста, обратите внимание, что этот метод является небезопасным и непереносимым и т.д. гораздо лучше решить ваши проблемы с помощью stdlib.

+0

Это вряд ли работает. (Я имею в виду, что единственное место, которое на самом деле работает из-за используемого синтаксиса, - это MSVC * при компиляции для 32-битного *.) – Griwes

+0

@Griwes Вы правы. Вот почему ts должен использовать не этот код, а что-то подобное на его платформе. И я упомянул, что это решение следует рассматривать только как последнюю границу. – alexeykuzmin0

2

Если вам действительно нужно реализовать функции 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; 
} 
2

Вы можете использовать серии Тейлора, чтобы реализовать это самостоятельно. Код прямо вперед:

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 и СРОКИ были только директивы препроцессора (#define «ы), которые я использовал, будучи PI 3,14159 (в моем случае я использовал 50 цифр точности пи, что такое совершенно не нужно) и термы 7

Смежные вопросы