【问题标题】:symbolic computation符号计算
【发布时间】:2010-12-28 03:38:59
【问题描述】:

有没有人知道在 C++ 中进行代数计算的好方法/库?

我有一个用 c++ 开发的应用程序,它需要进行代数计算。现在,我构建了一个 C++ 解析器,它接受字符串形式的表达式,如“5 + (2 - MYFUNC(3))”,这些表达式被标记为结构,然后使用 Shunting Yard 算法转换为后缀符号并进行评估。

这些表达式中的 MYFUNC 是我自己定义的函数,可以进行一些复杂的计算。

这是一个高性能的应用程序,表达式也有变量被动态替换为值并且表达式被重新评估

例如var1 + (2 - MYFUNC(var2)) -> 在运行过程中将 var1 和 var2 替换为一些值并重新评估

我正在使用 Linux,到目前为止找到了 Giac library,但不确定它是否好用,欢迎任何反馈。

人们通常如何解决这个问题?在这种情况下,主要语言是 C++。

【问题讨论】:

    标签: c++ math


    【解决方案1】:

    看看 Bison 和 Flex Parser。这里的基本思想是编写一个语法文件并将其转换为可以集成到您的应用程序中的 C 代码。任何关于 Flex 和 Bison 的书 (http://www.amazon.com/Flex-Bison-Text-Processing-Tools/dp/0596155972) 都足以初步阅读。

    也许这对你有帮助。!

    【讨论】:

    • 谢谢,我会调查的。我已经走上了类似的道路,正在研究 Boost::Spirit 来为此创建一个 DSL,但觉得它变得有点矫枉过正。到目前为止,从 cmets 看来,编译的 C 函数将是一个非常高效的解决方案。只需要找到合适的工具。
    【解决方案2】:

    处理此问题的最快方法可能是在运行时为定义的函数生成一个已编译、优化的函数,并针对您可能拥有的不同变量值对其进行评估。您可以使用LLVM 来完成此操作,可能还有其他工具。

    【讨论】:

    • 这是否类似于正则表达式如何为优化编译表达式?
    • 有一些相似之处,但据我所知,正则表达式被编译成一个可以更快评估的表。使用 LLVM,您将编译为机器代码,您将获得一个要调用的函数指针。您可以为每组变量值构建一个函数,或者更有可能将它们作为参数传递给该函数。
    • 但是由于主 C++ 程序和 LLVM 函数都将被编译,所以性能上不会有任何差异。在这两种情况下,代数字符串都会以相同的方式被解析和评估,不是吗?
    • 我不确定你的意思,所以我会说这个。性能应该接近实现代数函数的编译 C++ 函数的速度。当然,您可以在运行时改变函数。在运行时编译会产生损失,但如果它在函数的多次执行中分摊,则可以忽略不计。
    【解决方案3】:

    我会为该语言编写一个递归下降解析器,因为语法看起来不是很复杂。解析可能比说 Flex/Bison 慢一点,但我猜测解析将是您项目中计算成本最低的。

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 1970-01-01
      • 2013-04-30
      • 2016-07-10
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多