在 C++ 中评估数学表达式
Evaluating a mathematical expression in C++
在我已经研究了一段时间的编码问题中,我已经到了必须计算如下所示的数学表达式的步骤:
3 * 2 ^ 3 ^ 2 * 5
应该这样评价:
3 * 2 ^ 3 ^ 2 * 5 = 3 * 2^(3 * 2) * 5 = 3 * 64 * 5 = 960.
在我当前的实现形式中,我有两个向量,一个包含整数形式的操作数,而另一个包含字符形式的运算符。
对于当前情况,它们将是:vector<int> operands = { 3, 2, 3, 2, 5 }
和 vector<char> operators = { '*', '^', '^', '*' }
。
这只是一个示例,运算顺序可能有所不同,因为乘法可能并不总是要执行的 first/last 运算。
我已经在这个特定的步骤停留了一段时间,即将两个向量容器封装的表达式计算为一个整数。我已经查看了一些可以在网上找到的数学解析器,但我仍然不知道如何实施正确的评估。
非常感谢一个解决方案。
expression templates 可以满足您的需求。它们使得以非标准顺序评估表达式成为可能 and/or 行为 - 使用它们您还可以为表达式中的同一运算符定义多个含义。
在解析表达式时简单地计算值,为最终乘积维护一个变量,为当前被乘数维护一个变量(即具有相应基数的当前指数组)。如您所见,按顺序应用每个指数操作数,从而执行左关联取幂。
顺便说一句,我不会费心以某种矢量化格式存储整个表达式;我认为这样做没有任何有用的理由。
在我已经研究了一段时间的编码问题中,我已经到了必须计算如下所示的数学表达式的步骤:
3 * 2 ^ 3 ^ 2 * 5
应该这样评价:
3 * 2 ^ 3 ^ 2 * 5 = 3 * 2^(3 * 2) * 5 = 3 * 64 * 5 = 960.
在我当前的实现形式中,我有两个向量,一个包含整数形式的操作数,而另一个包含字符形式的运算符。
对于当前情况,它们将是:vector<int> operands = { 3, 2, 3, 2, 5 }
和 vector<char> operators = { '*', '^', '^', '*' }
。
这只是一个示例,运算顺序可能有所不同,因为乘法可能并不总是要执行的 first/last 运算。
我已经在这个特定的步骤停留了一段时间,即将两个向量容器封装的表达式计算为一个整数。我已经查看了一些可以在网上找到的数学解析器,但我仍然不知道如何实施正确的评估。
非常感谢一个解决方案。
expression templates 可以满足您的需求。它们使得以非标准顺序评估表达式成为可能 and/or 行为 - 使用它们您还可以为表达式中的同一运算符定义多个含义。
在解析表达式时简单地计算值,为最终乘积维护一个变量,为当前被乘数维护一个变量(即具有相应基数的当前指数组)。如您所见,按顺序应用每个指数操作数,从而执行左关联取幂。
顺便说一句,我不会费心以某种矢量化格式存储整个表达式;我认为这样做没有任何有用的理由。