символическое вычисление - PullRequest
9 голосов
/ 28 декабря 2010

Кто-нибудь знает хороший подход / libs для выполнения алгебраических вычислений в C ++?

У меня есть приложение, разрабатываемое на c ++, которое должно выполнять алгебраические вычисления. На данный момент я создал синтаксический анализатор C ++, который принимает выражения в виде строк типа «5 + (2 - MYFUNC (3))», которые токенизируются в структуры, а затем преобразуются в постфиксную запись с использованием алгоритма Shunting Yard и оцениваются.

MYFUNC в этих выражениях - мои собственные определенные функции, которые могут выполнять некоторые сложные вычисления.

Это высокопроизводительное приложение, в выражениях также есть переменные, которые динамически заменяются значениями, а выражение переоценивается

например. var1 + (2 - MYFUNC (var2)) -> с заменой var1 и var2 на некоторые значения в ходе прогона и повторной оценкой

Я использую Linux и до сих пор нашел библиотеку Giac , но не уверен, что это хорошо, любые отзывы будут приветствоваться.

Как люди обычно подходят к этой проблеме? Основным языком в этом случае является C ++.

Ответы [ 3 ]

2 голосов
/ 28 декабря 2010

Посмотрите на Bison и Flex Parser. Основная идея здесь заключается в том, что файл грамматики будет записан и преобразован в код C, который может быть интегрирован в ваше приложение. Любая книга о Flex и Bison (http://www.amazon.com/Flex-Bison-Text-Processing-Tools/dp/0596155972) достаточно хороша для начального чтения.

Может быть, это тебе поможет.!

1 голос
/ 28 декабря 2010

Вероятно, самый быстрый способ справиться с этим - создать скомпилированную оптимизированную функцию во время выполнения для определенной функции и оценить ее для различных значений переменных, которые могут у вас быть.Вы можете сделать это с LLVM , возможно, другими инструментами.

0 голосов
/ 28 декабря 2010

Я бы написал парсер рекурсивного спуска для языка, потому что синтаксис не выглядит очень сложным.Разбор может быть немного медленнее, чем, скажем, Flex / Bison, но я предполагаю, что анализ будет наименее затратным в вычислительном отношении в вашем проекте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...