¿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; p>
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 ; p>
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); p> } else {cout<< "Nombre de función desconocida" < } } else if(c=='+'||c=='-'||c=='*'||c=='/'||c=='^') p> { 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 { p> --ist; op[iop-1] = c; cambiar(cc) { caso '*': ST[ist-1] *= ST[ist];romper; caso '/': ST[ist-1] /= ST[ist];romper; p> 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; } p> ú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; }