void Round (Token ** Pila) { Token *Operando = EntornoEjecucion_BuscaSimbolo (*Pila); if (Buzon.GetHuboError ()) return; if (NoEsReal (Operando)) { BorrarTokenSiEsVariable (Operando); return; } long double ValorDominio = Operando->GetDatoReal (); BorrarTokenSiEsVariable (Operando); long double ValorRetorno = floorl (fabsl (ValorDominio) + 0.5L) * (ValorDominio < 0 ? (-1.0L) : (1.0L)); Token *TokenRetorno = ConsigueToken (ValorRetorno); if (Buzon.GetHuboError ()) return; delete Desapila (Pila); Apila (Pila, TokenRetorno); return; }
void Random (Token ** Pila) { Token *Operando = EntornoEjecucion_BuscaSimbolo (*Pila); if (Buzon.GetHuboError ()) return; if (NoEsReal (Operando)) { BorrarTokenSiEsVariable (Operando); return; } long double ValorDominio = (Operando->GetDatoReal ()); BorrarTokenSiEsVariable (Operando); long double ValorAleatorio = rand (); if (ValorDominio > 32767.0L) ValorAleatorio *= ValorDominio / 32767.0L; long double ValorRetorno = ceill (fmod (ValorAleatorio, ValorDominio)); Token *TokenRetorno = ConsigueToken (ValorRetorno); if (Buzon.GetHuboError ()) return; delete Desapila (Pila); Apila (Pila, TokenRetorno); return; }
void Ln (Token ** Pila) { Token *Operando = EntornoEjecucion_BuscaSimbolo (*Pila); if (Buzon.GetHuboError ()) return; if (NoEsReal (Operando)) { BorrarTokenSiEsVariable (Operando); return; } long double ValorDominio = Operando->GetDatoReal (); BorrarTokenSiEsVariable (Operando); long double ValorRetorno = logl (ValorDominio); if (Buzon.GetHuboError ()) return; Token *TokenRetorno = ConsigueToken (ValorRetorno); if (Buzon.GetHuboError ()) return; delete Desapila (Pila); Apila (Pila, TokenRetorno); return; }
void ArcoTangente (Token ** Pila) { Token *Operando = EntornoEjecucion_BuscaSimbolo (*Pila); if (Buzon.GetHuboError ()) return; if (NoEsReal (Operando)) { BorrarTokenSiEsVariable (Operando); return; } long double ValorDominio = Operando->GetDatoReal (); BorrarTokenSiEsVariable (Operando); long double ValorRetorno = atanl (ValorDominio); if (Buzon.GetHuboError ()) return; ValorRetorno = Estado.AngulosEnGrados ? ValorRetorno * (180.0L / M_PI) : ValorRetorno; Token *TokenRetorno = ConsigueToken (ValorRetorno); if (Buzon.GetHuboError ()) return; delete Desapila (Pila); Apila (Pila, TokenRetorno); return; }
void Coseno (Token ** Pila) { Token *Operando = EntornoEjecucion_BuscaSimbolo (*Pila); if (Buzon.GetHuboError ()) return; if (NoEsReal (Operando)) { BorrarTokenSiEsVariable (Operando); return; } long double ValorRetorno; long double ValorDominio = Operando->GetDatoReal (); BorrarTokenSiEsVariable (Operando); ValorDominio = Estado.AngulosEnGrados ? ValorDominio * (M_PI / 180.0L) : ValorDominio; if (fabsl (sinl (ValorDominio)) == 1.0L) ValorRetorno = 0.0L; else ValorRetorno = cosl (ValorDominio); if (Buzon.GetHuboError ()) return; Token *TokenRetorno = ConsigueToken (ValorRetorno); if (Buzon.GetHuboError ()) return; delete Desapila (Pila); Apila (Pila, TokenRetorno); if (FueraDeRango (TokenRetorno)) return; return; }
void VariableVector::EvaluaIndices () { ListaExpresiones & L = Lista; L.Reset (); unsigned int *Vec = VectorIndices; for (int j = 0; j < L.GetNItems(); ++j) { Token *t = EvaluaPostfijo (L.Itera()); if (Buzon.GetHuboError ()) return; if (t->GetTipoDato () != REAL) { //los indices deben ser enteros positivos // un error pa' el buzon delete t; Buzon.Error (INDICES); return; } long double v = t->GetDatoReal (); delete t; if (v < 0L || v > 65535L || (floor (v) != v)) { // los indices deben ser enteros positivos //menores o iguales a 65535; un error pa' el buzon Buzon.Error (INDICES); return; } Vec[j] = v; } }
void Tangente (Token ** Pila) { Token *Operando = EntornoEjecucion_BuscaSimbolo (*Pila); if (Buzon.GetHuboError ()) return; if (NoEsReal (Operando)) { BorrarTokenSiEsVariable (Operando); return; } long double ValorDominio = Operando->GetDatoReal (); BorrarTokenSiEsVariable (Operando); ValorDominio = Estado.AngulosEnGrados ? ValorDominio * M_PI / 180.0L : ValorDominio; long double ValorSeno = sinl (ValorDominio); long double ValorCoseno = cosl (ValorDominio); long double ValorRetorno; if (fabsl (ValorSeno) == 1.0L) { Buzon.Error (LLAMADO_DE_FUNCION_NO_VALIDO); return; } else if (ValorCoseno == 1.0L) ValorRetorno = 0.0L; else ValorRetorno = tanl (ValorDominio); if (Buzon.GetHuboError ()) return; Token *TokenRetorno = ConsigueToken (ValorRetorno); if (Buzon.GetHuboError ()) return; delete Desapila (Pila); Apila (Pila, TokenRetorno); if (FueraDeRango (TokenRetorno)) return; return; }