грех & amp; cos funcs без математики

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

2

Решение

Если вам действительно нужно реализовать функции sin и cos самостоятельно, используйте серию Тейлора 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!=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;
}
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, я сделал простую степенную функцию для этого алгоритма. Также вам нужна функция для расчета факторных чисел. Вот они:

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 были просто директивами препроцессора (#defines) Я использовал, будучи PI 3.14159 (в моем случае я использовал пи с точностью до 50 цифр, что совершенно не нужно), а УСЛОВИЯ были 7.

3

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

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

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

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

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector