2011-03-10 105 views
2

是否有任何免费的库让用户轻松建立一个C数学表达式,它可以像任何其他函数一样使用?我的意思是c表达/函数可以像'内联'数学表达一样快,并且可以在程序中多次使用。 我认为我可以用C来完成,但是有没有人可以告诉它,如果它必须是CUDA的dveice函数,它可能是真实的吗?如何让用户创建一个函数? [ 图书馆 ? ]

+0

用户如何调用此函数? – Argote 2011-03-10 00:16:05

+0

你的意思是像[自动编程](http://en.wikipedia.org/wiki/Automatic_programming)? – pmg 2011-03-10 00:18:13

+0

你想要一个数学解析器吗? – 2011-03-10 00:19:43

回答

2

有几个选项。我假设你想要的东西,用户可以“拨打”好几次,像这样:

void *s = make_func("2 * x + 7"); 
... 
printf("%lf\n", call_func(s, 3.0)); // prints 13 
... 
printf("%lf\n", call_func(s, 5.0)); // prints 17 
... 
free_func(s); 

一种选择是实现这个作为一个递归结构保持功能指针和常量。喜欢的东西:

enum item_type { VAR, CONST, FUNC }; 

struct var { 
    enum item_type; 
    int id; 
}; 

struct constant { 
    enum item_type; 
    double value; 
}; 

struct func { 
    enum item_type; 
    double (*func)(double, double); 
    enum item_type *a, *b; 
}; 

然后make_func会分析上面的字符串转换成类似:

(struct func *){ FUNC, &plus, 
    (struct func *){ FUNC, &times, 
    (struct constant *){ CONST, 2 }, 
    (struct var *){ VAR, 'x' } } 
    (struct constant *){ CONST, 7 } } 

如果你能明白 - 在struct funcenum type_item用来指向下一个节点树(或者说,该节点的第一个元素,即enum)和enum是我们的代码用来找出项目类型的内容。然后,当我们使用call(void *, ...)函数时,它会计算有多少个变量 - 这是函数应该传递多少个额外参数 - 然后用我们调用的值替换变量,然后执行计算。

另一种选择(可能会更快,更容易延长)是使用类似libjit的东西来为你完成大部分工作。我从来没有使用它,但JIT编译器为您提供了一些基本构建块(如添加,乘法等“指令”),您可以根据需要将它们串起来,然后将它们编译为实际汇编代码(如此没有经过构造的语法树调用像我们以前所需的函数指针),所以当你调用它时,它尽可能快速和动态。

我不知道libjit的API,但它看起来很容易能够做你看起来需要的东西。 make_funcfree_func可能都与上述内容几乎相同(您可能必须将呼叫更改为call_func),并且基本上会根据它解析用户的字符串的方式构建,使用和销毁JIT对象。与上面相同,确实如此,但您不需要自己定义语法树,数据类型等。

希望有些帮助。

+1

我想我应该改变“常量”到“文字”。好吧。我会在今天晚些时候尝试真正实现这些乐趣的时候去做。 – 2011-03-10 01:02:27

+1

你的想法和我的乐趣似乎差异很大。 :-D – 2011-03-10 03:46:44