歡迎大家進行測試:數學表達式編譯計算動態庫FORCAL 
瀏覽:418218 評論:1
關于FORCAL <BR><BR> Forcal為Formula Calculator的縮寫,是一個數學表達式編譯計算系統,利用Forcal可以在軟件中自由地添加各種數值計算功能。Forcal由一個功能完備的數學式編譯器和一個速度極快的數學式編譯代碼計算器組成,從以下的說明中您可以了解到Forcal的全貌。 <BR>一、FORCAL表達式: <BR> FORCAL可以編譯計算的數學表達式格式如下: <BR> 格式1:F(x,y,x1,... ...)=1-x+sin[x1]-... ... <BR> 格式2:()=2+3*ln[3.45] <BR> 格式3:2+3*ln[3.45] <BR> 格式4:F(x,y)=2+sin[aa]+cos[aa-x]+bb,aa=3*ln[y-bb],bb=x+y+x*y <BR> 格式5:{F(x,y)=2+sin[aa]+cos[aa-x]+bb,aa=3*ln[y-bb],bb=x+y+x*y} <BR> 格式1:F 為函數名,可為任意字符,或者缺省;自變量放在小括號( )內,有多個自變量時,自變量間以逗號分隔,自變量為以小寫英文字母開頭的任意小寫英文字母與數字的組合,自變量個數可以為零;等號后為函數式,不可缺省。 <BR> 格式2和格式3是等效的,均表示無參函數。 <BR> 格式4:數學表達式的可優化表示形式。aa、bb為符號定義名,其命名方式與自變量相同且不能與任何一個自變量同名。該格式的計算順序為從右向左,即:先計算bb,然后計算aa,最后計算F(x,y)并把該值作為整個表達式的值。 <BR> 格式5表示可以將表達式放在一對括號( )、[ ]或{ }內。 <BR> 函數式中的運算符有加號'+'、減號'-'、乘號'*'、除號'/'和乘方'^'五種,注意數字與自變量相乘時,乘號不可省略。函數式中可以用三對括號( )、[ ]和{ }。 <BR> FORCAL表達式有實數表達式和復數表達式兩種。 <BR> 實數表達式中可以使用的基本函數如下: <BR> 一級函數:平方根sq,指數函數exp,常用對數lg,自然對數ln,正弦sin,余弦cos,正切tg,反正弦as,反余弦ac,反正切at,雙曲正弦sh,雙曲余弦ch,雙曲正切th,取整函數int,絕對值abs。 <BR> 二級函數: <BR> 1、累加函數lj8(n,x):int[abs(n)]的取值范圍為1~8,指定內存中的存儲位置,x為雙精度實數,當n>0時,該函數將x與內存中int[abs(n)]位置的內存數相加并重新存儲到內存,同時返回相加后的數值,當n<0 時,在int[abs(n)]位置存儲并返回x值; <BR> 2、反正切at2(x,y):求x/y的正切值,所在象限由x和y的符號確定; <BR> 3、最小值函數min(x1,x2,x3,... ...); <BR> 4、最大值函數max(x1,x2,x3,... ...); <BR> 5、余數函數fmod(x,y):求x/y的余數; <BR> 6、取小數部分函數modf(x):該函數把x分解成整數和小數部分,并返回小數部分; <BR> 7、符號傳送函數sign(x,y):該函數的符號取y的符號,數值取x的絕對值,若y=0無符號傳送,返回x值; <BR> 8、正差函數dim(x,y):當x>y時得x-y,否則返回0; <BR> 9、數值測試函數testdouble(x,y,z):該函數測試z是否在x和y之間,如果不在x和y之間,可由fcdllerr()函數檢查到這個錯誤,該函數總是返回z值; <BR> 10、隨機數發生器種子設置srand(x):該函數用來建立由rand()所產生的序列值的啟始點,返回0; <BR> 11、隨機數rand():該函數產生一個隨機數,每調用一次,就返回一個0到RAND_MAX之間的整數,RAND_MAX的值由C++定義; <BR> 12、設置存儲空間大小setstore(m):該函數設置int(m)個雙精度實數存儲空間,若int(m)<1,則刪除該存儲空間,返回0; <BR> 13、存儲函數store(n,x):該函數將x值存儲到由setstore申請的空間的int[abs(n)]位置,n是一個負數,返回x值; <BR> 14、取得存儲函數的值store(n):該函數獲得由setstore申請的空間的int(n)位置的值,n是一個正數,使用store函數可以進行多個表達式之間的相互通信,因而可以簡化構建復雜的計算。 <BR> 復數表達式中可以使用的基本函數如下: <BR> 平方根sq,指數函數exp,自然對數ln,正弦sin,余弦cos,取整函數int,絕對值abs,共軛函數con。 <BR> 復數舉例:2+3i。 <BR> 復數表達式舉例:F(x,y,... ...)=2+3i-sin[x-i]*ln[y]- ... ... 。 <BR> 在復數表達式中不能使用 i 作為自變量,因為 i 已經用來表示虛數。 <BR> 另外,FORCAL編譯器在編譯表達式時能進行兩種形式的代碼優化,其一是預先計算表達式中可以計算的部分,其二是采用格式4表示的數學表達式的可優化形式。 <BR> FORCAL將最大限度地進行第一種代碼優化,但這種自動進行的優化并不徹底,若要獲得最優化的代碼,您需要將表達式中可以計算的部分用括號括起來(一般情況下不需要這樣做)。 <BR> 例如:要想進行徹底的第一種代碼優化,需要將式子: <BR> F(x,y)=x-5-7+y <BR> 寫成:F(x,y)=x-[5+7]+y或F(x,y)=x+[-5-7]+y <BR> 需要注意的是,在進行第一種代碼優化時,只有一級函數可以進行預先計算,二級函數的計算始終只能在編譯后的表達式中進行。 <BR> FORCAL的第二種代碼優化可以保證表達式中的任何相同部分只進行一次計算,從而最大限度地提高了計算速度。 <BR>二、FORCAL的速度: <BR> 由于編譯表達式所占的時間很少,所以這里只比較FORCAL與FORTRAN(或C/C++)的計算速度。 <BR> 1、對純數學表達式計算速度的比較 <BR> FORCAL是由FORTRAN(或C/C++)的編譯程序生成的,所以它的速度要稍慢些,約為FORTRAN(或C/C++)的編譯速度的50%左右。一般,表達式越長越復雜,FORCAL與FORTRAN(或C/C++)的計算速度就越接近。 <BR> 2、綜合比較 <BR> 綜合比較是指由FORCAL生成的實用程序和由FORTRAN(或C/C++)直接生成的實用程序的速度的比較。在實用程序中,除了計算表達式外,還有很多的算法處理,這使得它們之間的速度差別在縮小,毋庸質疑,算法處理所占的時間越長,它們的速度差別就越小。另外,啟動FORTRAN(或C/C++)編譯程序進行編譯和出錯調試等要占用一定的時間,這些時間要遠比使用FORCAL進行同樣的工作所用的時間要長。所以,綜合來看,除了運算量特別巨大的程序,使用FORCAL要比使用FORTRAN(或C/C++)進行計算要快。 <BR> 3、FORCAL的速度還能提高嗎 <BR>回答是肯定的。因為FORCAL系統由編譯和計算兩部分組成,它編譯數學表達式后的代碼質量是非常高的,但目前使用的FORCAL由FORTRAN(或C/C++)生成,這使得FORCAL的計算代碼中有些是不必要的,白白增加了執行時間。所以,如果FORCAL的計算部分用匯編語言來寫,將能加快它的執行速度;如果讓計算機的數學協處理器來執行FORCAL的計算部分,將能把FORCAL的計算速度推向極至。 <BR> 以上是作者本人的一些看法,FORCAL的功能和速度將在實踐中得到檢驗。 <BR><BR> 直接下載:
http://go5.163.com/wangluwanglu/xiazai/d_forcaldll.zip <BR> 或訪問:
http://wangluwanglu.yeah.net/ <BR><BR> 山東省工業學校工藝教研室(255070) 王 祿 <BR>
技術鄰APP
工程師必備
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP
1




















