Red de conocimiento informático - Conocimiento sistemático - ¿Programación en ensamblaje para encontrar el seno o el coseno de un radian?

¿Programación en ensamblaje para encontrar el seno o el coseno de un radian?

Hola, la instrucción de operación de la función trigonométrica es:

Instrucción SIN

sin double sin(double x calcula el valor del seno de x radianes

asin double asin(double x); Calcula el arcoseno de un número de punto flotante cuyo valor absoluto no es mayor que 1

Esta instrucción extrae un operando de la pila de operaciones y calcula su seno trigonométrico. (radianes) y envíe el resultado a la pila de operaciones.

Comando CON

cos double cos(double x); Calcula el valor del coseno de x radianes

acos double acos(double x); no mayor que el arcocoseno de un número de punto flotante 1

Esta instrucción extrae un operando de la pila aritmética, calcula su coseno trigonométrico (radianes) y envía el resultado a la pila aritmética.

Por ejemplo, puedes imitar el siguiente ejemplo para calcular~

#include

#include

# incluir

#include

#include

#include

usando el espacio de nombres std ;

const char Tab=0x9;

const int DIGIT=1;

doble diversión(doble x,char op[],int *iop)

{

while(op[*iop-1]<32) //Esta línea hace innecesario agregar paréntesis al llamar a funciones anidadas

// Como arc sin(sin(1.234)) Simplemente escriba arc sin sin 1.234

switch(op[*iop-1])

{

caso 7: x=sin(x); (*iop)--;break;

caso 8: x=cos(x); (*iop)--;break;

caso 9: x=tan(x); (*iop)--;break;

caso 10: x=sqrt(x); (*iop)--;break;

caso 11: x=asin(x); (*iop)--;break;

caso 12: x=acos(x); (*iop)--;break;

p>

caso 13: x=atan(x); (*iop)--;break;

caso 14: x=log10(x);(*iop)- -;romper;

caso 15: x=log(x); (*iop)--;romper;

caso 16: x=exp(x); )--; romper;

}

devolver x;

}

doble calc(char *expr,char **addr )

{

static deep; //Profundidad de recursión

static char *fname[]={ "sin","cos","tan", "sqrt",

"arcsin","arccos","arctan","lg","ln","exp",NULL};

doble ST[10] ={0.0} ; //Pila de números

char op[10]={'+'}; //Pila de operadores

char c,*rexp,*pp,*pf ;

int ist=1,iop=1,last;

if(!deep)

{

pp=pf= expr;

hacer

{

c = *pp++;

> if(c!=' '&& c!=Tab)

*pf++ = c;

}

mientras(c!='\0' );

}

pp=expr;

if((c=*pp)=='-'||c=='+')

{

op[0] = c;

pp++;

}

último = !DÍGITO ;

while((c=*pp)!='\0')

{

if(c=='(')//izquierda Paréntesis

{

deep++;

ST[ist++]=calc(++pp,addr);

deep-- ;

ST[ist-1]=fun(ST[ist-1],op,&iop);

pp = *addr;

último = DÍGITO ;

if(*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2))

{ ////Propósito Sí : Cuando el paréntesis derecho es

op[iop++]='*'; ////El paréntesis derecho es el paréntesis izquierdo o función

last = !DIGIT; /nombre, el valor predeterminado es multiplicación

c = op[--iop]; /////////////////////////// ///

ir a operar ; //////////////////////////////

}

}

else if(c==')')//paréntesis derecho

{

pp++;

romper;

}

else if(isalpha(c))

{

if(!strnicmp(pp ,"Pi",2))

{

if(last==DIGIT){cout<< "π se encuentra en el lado izquierdo)" <

ST[ist++]=3.14159265358979323846;

ST[ist-1]=fun(ST[ist-1],op,&iop);

pp += 2;

último = DÍGITO;

if(!s

trnicmp(pp,"Pi",2)){cout<< "Dos π están conectados" <

if(*pp=='('){cout << "El lado derecho de π se encuentra (" <

}

else

{

for(int i=0; (pf=fname[i])!=NULL; i++)

if(!strnicmp(pp,pf,strlen(pf)))break;

if(pf!=NULL)

{

op[iop++] = 07+i;

pp += strlen(pf);

}

else {cout<< "Nombre de función desconocida" <

}

}

else if(c=='+'||c=='-'||c=='*'||c=='/'||c=='^')

{

char cc;

if(last != DIGIT){cout<< "Operador pegado" <

pp++;

if(c=='+'||c=='-')

{

hacer< / p>

{

cc = op[--iop];

--ist;

switch(cc)

{

caso '+': ST[ist-1] += ST[ist];romper;

caso '-': ST[ist-1] -= ST [ist];romper;

caso '*': ST[ist-1] *= ST[ist];romper;

caso '/': ST[ist- 1 ] /= ST[ist];romper;

caso '^': ST[ist-1] = pow(ST[ist-1],ST[ist]);romper;

}

}

while(iop);

op[iop++] = c;

}

else if(c=='*'||c=='/ ')

{

operar: cc = op[iop-1];

if(cc=='+'||cc=='- ')

{

op[iop++] = c;

}

más

{

--ist;

op[iop-1] = c;

cambiar(cc)

{

caso '*': ST[ist-1] *= ST[ist];romper;

caso '/': ST[ist-1] /= ST[ist];romper; p>

caso '^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;

}

}

}

más

{

cc = op[iop-1];

si (cc =='^'){cout<< "Uso concurrente de símbolos de exponenciación" <

op[iop++] = c;

}

último = !DÍGITO;

}

else

{

if(último == DÍGITO ){cout << "Dos números están atascados" <

ST[ist++]=strtod(pp,&rexp);

ST[ist -1]= fun(ST[ist-1],op,&iop);

if(pp == rexp){cout<< "Carácter ilegal" <

pp = rexp;

último = DÍGITO;

if(*pp == '('||isalpha(*pp))

{

op[iop++]='*';

último = !DIGIT;

c = op[--iop]; ///////////// /////////////////

ir a operar ; /////////////////////// // /////

}

}

}

*addr=pp;

if( iop>=ist){cout<< "Error de expresión" <

while(iop)

{

--ist;

switch(op[--iop])

{

caso '+': ST[ist-1] += ST [ist];romper;

caso '-': ST[ist-1] -= ST[ist];romper;

caso '*': ST[ist-1 ] *= ST[ist];romper;

caso '/': ST[ist-1] /= ST[ist];romper;

caso '^': ST [ist-1] = pow(ST[ist-1],ST[ist]);romper;

}

}

return ST[0 ];

}

int main()

{

char s[128],*end;

system("chcp 936"); //Página de códigos chino

while(1)

{

cout << "Por favor, introduzca la expresión: ";

cin.getline(s,128);

cout << setprecision(17) << calc(s,&end) << endl;

}

devuelve 0;

}