2010-12-28 22 views
9

¿Alguien sabe un buen enfoque/libs para hacer cálculos algebraicos en C++?cálculo simbólico

Tengo una aplicación desarrollada en C++ que necesita hacer cálculos algebraicos. Por ahora construí un analizador de C++ que acepta expresiones en forma de cadenas como "5 + (2 - MYFUNC (3))" que se tokenizan en estructuras y luego se convierten en notación de postfijo usando el algoritmo de yarda de derivación y se evalúan.

El MYFUNC en estas expresiones son mis propias funciones definidas que pueden hacer algunos cálculos complejos.

Esta es una aplicación de alto rendimiento, las expresiones también tienen variables que están dinámicamente reemplazados con los valores y la expresión se vuelve a evaluar

por ejemplo var1 + (2 - MYFUNC (var2)) -> con var1 y var2 reemplazados por algunos valores durante el curso de la ejecución y reevaluados

Estoy usando Linux y hasta ahora encontré Giac library pero no estoy seguro de si es bueno , cualquier comentario sería bienvenido.

¿Cómo se suele enfrentar la gente a este problema? El lenguaje principal en este caso es C++.

Respuesta

2

Eche un vistazo a Bison y Flex Parser. La idea básica aquí es que un archivo de gramática se escribiría y se convertiría en código C que se puede integrar en su aplicación. Cualquier libro sobre Flex y Bison (http://www.amazon.com/Flex-Bison-Text-Processing-Tools/dp/0596155972) es lo suficientemente bueno para la lectura inicial.

¡Puede ser que esto te ayude!

+0

Gracias, lo investigaré. Ya estaba en una ruta similar de búsqueda en Boost :: Spirit para crear una DSL para esto, pero sentía que se estaba volviendo demasiado. Suena desde los comentarios hasta el momento que la función C compilada sería una solución muy eficiente. Solo necesito encontrar las herramientas adecuadas. –

1

Probablemente la forma más rápida de manejar esto es generar una función compilada y optimizada en el tiempo de ejecución para la función definida, y evaluarla para los diferentes valores de variables que pueda tener. Puede hacer esto con LLVM, probablemente otras herramientas.

+0

¿Sería similar a cómo Regex puede hacer expresiones compiladas para la optimización? –

+0

Hay algunas similitudes, pero según tengo entendido, las expresiones regulares se compilan en una tabla que es más rápida de evaluar. Con LLVM estarías compilando hasta código máquina, obtendrás un puntero a la función para llamar. Puede crear una función para cada conjunto de valores variables, o más probablemente, pasarlos como un parámetro a esta función. – ergosys

+0

Pero dado que tanto el programa principal de C++ como la función LLVM se compilarán, no habrá ninguna diferencia en el rendimiento. La cadena algebraica será analizada y evaluada de la misma manera en ambos casos, ¿no? –

0

Escribiría un analizador de descenso recursivo para el lenguaje, porque la sintaxis no parece muy compleja. El análisis puede ser un poco más lento que el de Flex/Bison, pero supongo que el análisis será el menos costoso desde el punto de vista computacional en su proyecto.