有没有一种算法可以在“树形结构”中给定任意符号代数表达式的符号?
我知道一般算法不存在,因为对于任意表达式,零识别问题是不可判定的,但是如何解决找到表达式符号的问题呢? (计算机代数中是如何做的?)
例如:sign(sqrt(2)-1) = ?
有没有一种算法可以在“树形结构”中给定任意符号代数表达式的符号?
我知道一般算法不存在,因为对于任意表达式,零识别问题是不可判定的,但是如何解决找到表达式符号的问题呢? (计算机代数中是如何做的?)
例如:sign(sqrt(2)-1) = ?
计算函数值
你需要一个函数求值引擎(编写起来并不难),如果你想要支持加减运算,那么就没有办法仅仅计算符号!所有我的函数求值器都是这样工作的:
编译函数的源文本。 首先创建支持函数表(id,操作数数量,名称,指向函数的指针),如下所示:一些示例函数(C++实现):
double sign(double op1)
{
if (op1>0.0) return +1.0;
if (op1<0.0) return -1.0;
return 0.0;
}
double sqrt1(double op1) { return sqrt(op1); }
double plus1(double op1) { return op1; }
double minus1(double op1) { return -op1; }
double plus2(double op1,double op2) { return op1+op2; }
double minus2(double op1,double op2) { return op1-op2; }
[注]
您需要处理特殊情况,例如function = "";
。此外,要注意空格、大小写敏感性,因为编译中的任何错误都会使结果无效。
速度不是一个大问题,这是解释-评估而不是数值解。所有操作都与您在纸上执行的操作相同次数。
您还应该处理数学错误(溢出、无效操作数、NaN
、Inf
等)
我通常将具有相同操作数的函数分组到自己的类型中以简化事情。