定义数学函数并在C / C ++函数中进行求值

时间:2015-08-21 08:34:41

标签: c++ c mathematical-expressions

下面的伪代码描述了我想要做的计算。我们的想法是设计一个C / C ++函数,它接受x的任何数学函数,并评估第一个N项的总和。 function(x)可以是任何功能,例如2x-1 , 2x , 1/x等。 xzeroN不等。我认为挑战是如何设计function(x)数据结构,我不确定这是否可以在没有任何数据结构的情况下实现(这样会更好)。

   function(x) = 2*x - 1 ;              

   sum_expression_to_N(  function(x)  , N ){

      float sum = 0.0;

      for ( int x =0; x<=N; x++){
           sum = sum +  function(x)       
      }
      return sum ;
  }

5 个答案:

答案 0 :(得分:2)

你正在重塑std::accumulate。 (你使用x = 0 ... N可以通过boost的计数迭代器来处理,而accumulate则需要二元运算符sum += f(x)而不是默认的sum+=x

在C ++中,采用其他函数的函数避免假设它们正在调用的内容。您在std::accumulate中看到了这一点:它是一个模板,因此它可以接受任何类型的函数(以及任何类型的输入迭代器)。

答案 1 :(得分:1)

对于您的用例,您可以使用C ++具有的非常简单和通用的模板功能:

template <class MathFunction> 
double foo (MathFunction function) {
    return function(1);
}

这可以处理任何可用作1-D数学函数的东西,包括lambdas,普通函数,std::function s,仿函数等。(Live

由于这也标记为C而上面是C ++,您还可以使用函数指针:

double fun (double (*function)(double)) {
    return function(1);
}

这适用于普通功能,无论如何你都可以使用它。 (Live

答案 2 :(得分:1)

这在现代C ++中是微不足道的。例如,您可以写

#include <iostream>

template <typename F>
float sum_expr_to_n(F f, int n) {
    float sum = 0;
    for (int i = 0; i <= n; ++i) sum += f(i);
    return sum;
}

int main() {
    auto f = [](int x) { return 2 * x - 1; };
    std::cout << sum_expr_to_n(f, 3) << std::endl;
}

答案 3 :(得分:0)

该函数是否应该由用户在运行时输入,或者您是否可以在编译时使用它? 在第二种情况下,它是微不足道的。 如果需要在运行时进行求值,则需要解析字符串并创建表达式的表示(通常是树)。 谷歌“解析树”,也看parsing math expression in c/c++

答案 4 :(得分:0)

这是我对此的抨击(C ++答案):

#include <iostream>
#include <vector>

using func = int (*)(int);

// define your functions here -> f1, f2, f3,...

int main() {
    std::vector<func> functions = {f1, f2, f3,...};

    for (func f : functions) {
        int sum = 0;
        for (int x = 0; x <= N; x++) {
           sum = sum + f(x)       
        }
        std::cout << sum << '\n';
    }
    return 0;
}

请注意,您定义的函数应遵循func指针给出的模式。

因此2x-1的函数必须如下所示:

int f1(int x) {
    return 2 * x - 1;
}

同样的事情也适用于其他人。所以只有逻辑改变,而不是函数参数或返回类型