[英]Sign of a symbolic algebraic expression
是否有任何算法可以找到“樹形式”中給出的任意符號代數表達式的符號?
我知道一般算法不存在,因為零識別問題對於任意表達式是不可判定的,但我該如何處理找到表達式符號的問題呢? (這是如何在計算機代數中完成的?)
例如: sign(sqrt(2)-1) = ?
評估函數值
你需要為函數鑒別發動機(它並不難代碼)有沒有辦法 只有當你想支持+,以評估標志 -操作! 我所有的函數評估程序都是這樣的:
編譯函數的源文本
首先創建支持的函數表(id,操作數,名稱,函數指針),如:
+,-,*,/,sin,cos,....
這些將是您需要評估的任何受支持表達式的構建塊。 不要忘記編寫代碼中的所有函數。 處理括號(
, )
也作為功能( push,pop
)。 按操作數的數量對函數進行分組,所以+,-
有1個和2個操作數(每個操作數有兩個不同的函數!!!)。
現在從表達式提取:
進入某種表/列表:
variables[](id,name,value) constants[](id,name,value) numbers [](id, ,value)
現在最后構造編譯的函數字符串。 我的字符串是兩個int
的集合。 首先是type
(使用哪個表),第二個是id
(表中的索引)。
例如表達式:
sign(sqrt(2)-1)
類型:
id type 0 function 1 number 2 constant 3 variable
職能:
id name pointer 0 '(' ??? 1 ')' ??? 2 '+' ??? 3 '-' ??? 4 '*' ??? 5 '/' ??? 6 'sqrt' ??? 7 'sign' ???
沒有變量或常量 。 數字是:
id value 0 2 1 1
編譯字符串:
type id 0 7 // sign(1 operand) 0 6 // sqrt(1 operand) 1 0 // 2 0 3 // - (2 operands) 1 1 // 1
編譯后,您需要解釋字符串並評估它的值。
init變量
op1=0`,`op2=0, // set all operands to zero (number depends on supported functions usually 2) opn=0 // actual operands number fx=none // actual function (for example none=-1) fxn=0 // actual function operands number
讀取編譯字符串的第一條記錄
如果是值(數字,常數,變量)設置適當的op?
使用它的值和增量操作數計數器opn++
。
如果它是函數集fx,fxn
代碼用它
如果opn == fxn
您達到了所需的操作數,因此執行函數fx
和init next函數
op1=fxtab[fx].pointer(op1,op2,...) fx=none,fxn=1 opn=1 (some spec functions can return more operands, then set op1,op2,.. opn=...)
如果不是字符串轉到#2結束但是有下一個字符串記錄
最后, op1
應該保持你的輸出值
一些示例函數(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 = "";
這樣的特殊情況function = "";
。 還要注意間距,區分大小寫,因為編譯中的任何錯誤都會使結果無效。
速度不是一個大問題,這是解釋 - 評估而非數值解決方案 。 所有操作都與您在紙上進行的操作相同。
您還應該處理數學錯誤(溢出,無效操作數, NaN
, Inf
...)
我通常將具有相同數量的操作數的函數分組為自己的類型以簡化操作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.