Конвертер латексных формул в C / C ++ - PullRequest
5 голосов
/ 25 октября 2011

Мне нужно преобразовать математическую формулу, написанную в стиле Latex, в функцию кода C / C ++.Например: y = sin (x) ^ 2 станет чем-то вроде

double y = sin(x) * sin(x);

или

double y = pow(sin(x), 2);

, где x являетсяпеременная определена где-то раньше.Я имею в виду, что он должен преобразовывать латексную формулу в синтаксис C / C ++.Так что если есть функция y = G (x, y) ^ F (x) , не имеет значения, что такое G (x, y) и F(x) , это проблема для программиста определить его.Он просто сгенерирует

double y = pow(G(x, y), F(x)); 

Когда формула слишком сложна, потребуется некоторое время, чтобы включить ее в формулу C / C ++, поэтому мне нужен такой конвертер.Есть ли?

Ответы [ 4 ]

9 голосов
/ 08 мая 2012

Встроенный в Emacs режим калькулятора calc-mode может сделать это (и многое другое).Ваши примеры могут быть преобразованы следующим образом:

Поместите формулу в некоторый буфер Emacs

$ y = sin(x)^2 $

С помощью курсора в формуле активируйте режим встроенного вычисления

M-x calc-embedded

Переключите язык отображения на C:

M-x calc-c-language

Там вы:

$ y == pow(sin(x), 2) $

Обратите внимание, что знак «=» в латексе интерпретируется как равенство, что приводит к «== 'для C. Латексный эквивалент оператора присваивания Cs' = 'будет' \ gets '.

Подробнее по этой теме в блог Turong

5 голосов
/ 25 октября 2011

Математическое уравнение, например, в LaTeX, и выражение C не являются взаимозаменяемыми. Первый устанавливает связь между двумя терминами, последний определяет сущность, которую можно оценить, однозначно получая одно значение. a = b в C означает «взять значение в переменной b и сохранить его в переменной a», где в Math это означает «в текущем контексте a и b равны». Первый описывает процесс вычисления, второй описывает статический факт. Следовательно, уравнение Математики можно перевернуть: a = b эквивалентно b = a, но выполнение того же уравнения с C дает нечто совершенно иное.

Что еще хуже, формулы LaTeX содержат только информацию, необходимую для отображения уравнений; часто этого недостаточно, чтобы уловить их значение.

Конечно, некоторые формулы LaTeX, как, например, ваш пример, могут быть преобразованы в вычисления C, но многие другие не могут, поэтому любой автоматизированный способ сделать это будет иметь лишь ограниченный смысл.

3 голосов
/ 29 июля 2012

Я знаю, что вопрос слишком старый, но я все равно просто добавлю ответ, так как думаю, что он может помочь кому-то еще позже.В моих поисках мне очень часто задавался вопрос.

Я работаю над инструментом, который делает нечто похожее, в публичном репозитории git

Вы будетенужно наложить некоторые искусственные ограничения на ваш латексный ввод, это не подлежит сомнению.В настоящее время инструмент, который я написал, поддерживает только mul, div, add, sub, sqrt, pow, frac и sum, поскольку это единственный набор операций, которые мне нужно обработать, и наложенные ограничения могут быть немного свободными, если предоставить препроцессор (см.preproc.l для [возможно, не очень хорошего] примера), который уберет необработанный латексный ввод.

0 голосов
/ 25 октября 2011

Я не уверен, что есть простой ответ, потому что математические формулы (в документах LaTeX) на самом деле неоднозначны, поэтому для автоматизации их перевода в некоторый код требуется автоматизация их понимания.

И в стандарте MathML IIRC есть две формы, представляющие формулы (одна для отображения, другая для вычислений), и для этого есть некоторые причины.

...