我需要将以Latex样式编写的数学公式转换为C/C++代码的函数.例如: y = sin(x)^ 2会变成类似的东西
double y = sin(x) * sin(x);
Run Code Online (Sandbox Code Playgroud)
要么
double y = pow(sin(x), 2);
Run Code Online (Sandbox Code Playgroud)
其中x是之前定义的变量.我的意思是它应该将乳胶配方转换为C/C++语法.因此,如果存在函数y = G(x,y)^ F(x),那么G(x,y)和F(x)是什么并不重要,程序员定义它是一个问题.它只会产生
double y = pow(G(x, y), F(x));
Run Code Online (Sandbox Code Playgroud)
当公式过于复杂时,需要花一些时间将其包含在C/C++公式中,这就是我需要这样一个转换器的原因.有没有?
Emacs的内置计算器计算模式可以做到这一点(以及更多).您的示例可以像这样转换:
将公式放在一些emacs缓冲区中
$ y = sin(x)^2 $
Run Code Online (Sandbox Code Playgroud)
将光标放在公式中,激活calc-embedded模式
M-x calc-embedded
Run Code Online (Sandbox Code Playgroud)
将显示语言切换为C:
M-x calc-c-language
Run Code Online (Sandbox Code Playgroud)
你在这:
$ y == pow(sin(x), 2) $
Run Code Online (Sandbox Code Playgroud)
请注意,它将latex中的'='符号解释为相等,这导致C的'=='.相当于Cs赋值运算符'='的乳胶将是'\ gets'.
有关Turong博客的更多相关主题
数学方程式(例如LaTeX中的数学方程式)和C表达式不可互换.前者陈述了两个术语之间的关系,后者定义了一个可以被评估的实体,明确地产生一个值.a = b在C中意味着'获取变量中的值b并将其存储在变量中a',在数学中,它表示'在当前上下文中,a和b相等'.第一个描述计算过程,第二个描述静态事实.因此,数学方程可以颠倒:a = b相当于b = a,但对C方程做同样的事情会产生一些完全不同的东西.
更糟糕的是,LaTeX公式只包含渲染方程所需的信息; 通常,这还不足以捕捉其含义.
当然,一些LaTeX公式,如你的例子,可以转换成C计算,但许多其他公式不能,所以任何自动化的方式只会有限的意义.
我知道这个问题太旧了,但无论如何我都会添加一个回复,因为我认为这可能会对其他人有所帮助。在我的搜索中,这个问题经常出现。
我正在开发一个在公共 git 存储库中执行类似操作的工具
您必须对乳胶输入进行一些人为限制,这是毫无疑问的。目前,我编写的工具仅支持 mul、div、add、sub、sqrt、pow、frac 和 sum,因为这些是我需要处理的唯一一组操作,并且通过提供预处理器,强加的限制可能会有点宽松(请参阅preproc.l 是一个[可能不太好的]示例),它将清除原始乳胶输入。