C++ Math Evaluator

Siguiendo con mis experimentos en teoría de lenguajes, hice una librería en C++ que permite evaluar y reconocer una expresión matemática entre otras cosas.

Estas son las características:

Operadores

&& ||
== != < > <= >=

  • + –
  • * / %
  • ^
  • !
  • Scientific notation

Funciones

  • factorial
  • log
  • acot
  • acosh
  • sign
  • acos
  • asech
  • atan
  • asinh
  • atanh
  • acoth
  • asin
  • acsc
  • acsch
  • asec
  • cot
  • coth
  • csc
  • csch
  • log10
  • log2
  • sec
  • sech
  • sqrt
  • tan
  • rand_0_to_1
  • sin
  • cos

Constantes numéricas:

pi
e
g (gravity)
random (random number)

User defined variables:

char expression[] = "sin(pi + x)";        
p.get_vars().add("x", 1.0);
p.parse(expression);
double result = p.get_numeric_answer();

Reconocimiento (saber si la expresión está bien escrita):

try {
    char expression[] = "pi^2.0 - sin(cos(tan(3.2e0)";
    p.evaluate_expression_with_exception(expression);
    cout << "Ok ... " << endl;
} catch(ParsingException ex) {
    cout << "Error: " << ex.get_msg() << endl;
}

Evaluation:

try {
    char expression[] = "pi^2.0 - sin(cos(tan(3.2e0)))";
    p.evaluate_expression_with_exception(expression);
    p.parse(expression);
    double r = p.get_numeric_answer();
    cout << "Ok ... " << r << endl;
} catch(ParsingException ex) {
    cout << "Error: " << ex.get_msg() << endl;
}

Arrays:

Parser p;
p.get_arrays().create_array("a");

for(int i = 1; i <= 10; i++) {
    p.get_arrays().add_element_to_array("a", (double)i);
}

try {
    char expression[] = "a[sin(pi) + 2]^3";
    p.parse(expression);
    double r = p.get_numeric_answer();
    cout << "Ok ... " << r << endl;
} catch(ParsingException ex) {
    cout << "Error: " << ex.get_msg() << endl;
}

Tokenization:

try {
    char expression[] = "a[sin(pi) + 2]^3";
    Parser p;
    p.extract_tokens(expression);

    vector<Lexema> tokens = p.get_lexemas_positions();

    for(size_t i = 0; i < tokens.size(); i++) {
        cout << tokens[i] << endl;
    }

} catch(ParsingException ex) {
    cout << "Error: " << ex.get_msg() << endl;
}

Salida:

{a, init(0), tipo(OPERADOR)}
{[, init(1), tipo(DELIMITADOR)}
{sin, init(2), tipo(FUNCION)}
{(, init(5), tipo(DELIMITADOR)}
{pi, init(6), tipo(VARIABLE)}
{), init(8), tipo(DELIMITADOR)}
{+, init(10), tipo(DELIMITADOR)}
{2, init(12), tipo(NUMERO)}
{], init(13), tipo(DELIMITADOR)}
{^, init(14), tipo(DELIMITADOR)}
{3, init(15), tipo(NUMERO)}

Function domain checking (trigonometric functions):

try {
    Parser p;
    char expression[] = "1 + asin(1.2)";
    p.evaluate_expression_with_exception(expression);
    p.parse(expression);
} catch(ParsingException ex) {
    cout << "Error: " << ex.get_msg() << endl;
}

Output:

Error: out of domain for function '1.200000'

La librería la pueden descargar de github:

https://github.com/leogtzr/math_evaluator_cpp

 

Saludos.

 

Anuncios

Acerca de leonardogtzr

Programmer ...
Esta entrada fue publicada en Uncategorized y etiquetada , , , . Guarda el enlace permanente.

Una respuesta a C++ Math Evaluator

  1. TrucomanX dijo:

    HOla Vi tu trabajo y quería preguntarte algo: Estoy pensando en hacer un micro-controlador en vhdl (GPL).
    Pero cuando este terminado tendría que programarlo en assembler (unas 32 instrucciones aprox). y eso seria muy engorroso para los usuarios. Estarías interesado en hacerte un compilador(GPL) de C para ese microcontrolador?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s