*********************************
* 关于FORCALDLL.DLL的声明 *
*********************************
您可以自由传播FORCALDLL.DLL普及版而不受任何限制,但FORCALDLL.DLL标准版仅供个人使用,未经授权禁止以任何形式传播FORCALDLL.DLL标准版。同时,对于这两个版本的动态库,您都不能仿制、解密或作其他任何形式的更改,否则将在法律许可的范围内受到最大可能的起诉。
*********************************
* FORCALDLL.DLL V2.2 使用说明 *
*********************************
导读:
1、认识FORCALDLL.DLL:介绍FORCAL的主要功能和用法,包括FORCAL动态库的输出函数说明。
2、FORCAL的二级函数:包括数据类型函数、逻辑函数、流程控制函数和一些常用数学函数等,极大地扩展了FORCAL的数值计算功能。
3、实例程序及源代码[forcaltest.exe]:这是一个由FORCALDLL.DLL支持的数值计算程序,用于全面演示FORCAL的函数包括所有的二级函数以及自定义外部函数的用法。在该程序中,你可以看到如何向FORCAL添加可由FORCAL调用的外部函数。同时,该程序中的一个自定义外部函数speed()比较了FORCAL和VC的执行速度。
正文:
--------------------------------1--------------------------------------
一、认识FORCALDLL.DLL
FORCALDLL.DLL是一个通用的数学表达式编译计算动态库,基于FORCAL技术构建,以下将简称为FORCAL。
(一)、FORCAL表达式:
FORCAL可以编译计算的数学表达式格式如下:
格式1:F(x,y,x1,... ...)=1-x+sin[x1]-... ...
格式2:()=2+3*ln[3.45]
格式3:2+3*ln[3.45]
格式4:F(x,y)=2+sin[aa]+cos[aa-x]+bb,aa=3*ln[y-bb],bb=x+y+x*y
格式5:{F(x,y)=2+sin[aa]+cos[aa-x]+bb,aa=3*ln[y-bb],bb=x+y+x*y}
格式1:F 为函数名,可为任意字符,或者缺省;自变量放在小括号( )内,有多个自变量时,自变量间以逗号分隔,自变量为以小写英文字母开头的任意小写英文字母与数字的组合,自变量个数可以为零;等号后为函数式,不可缺省。
格式2和格式3是等效的,均表示无参函数。
格式4:数学表达式的可优化表示形式。aa、bb为符号定义名,其命名方式与自变量相同且不能与任何一个自变量同名。该格式的计算顺序为从右向左,即:先计算bb,然后计算aa,最后计算F(x,y)并把该值作为整个表达式的值。
格式5表示可以将表达式放在一对括号( )、[ ]或{ }内。
函数式中的运算符有加号'+'、减号'-'、乘号'*'、除号'/'和乘方'^'五种。注意数字与自变量相乘时,乘号不可省略;在进行乘方运算时,底数应为非负数。函数式中可以用三对括号( )、[ ]和{ }。
FORCAL表达式有实数表达式和复数表达式两种。
实数表达式中可以使用的基本函数如下:
一级函数:平方根sq,指数函数exp,常用对数lg,自然对数ln,正弦sin,余弦cos,正切tg,反正弦as,反余弦ac,反正切at,双曲正弦sh,双曲余弦ch,双曲正切th,取整函数int,绝对值abs。
二级函数:请参见说明的第二部分。这些二级函数包括数据类型函数、逻辑函数、流程控制函数和一些常用数学函数等,极大地扩展了FORCAL的数值计算功能。
复数表达式中可以使用的基本函数如下:
平方根sq,指数函数exp,自然对数ln,正弦sin,余弦cos,取整函数int,绝对值abs,共轭函数con。
复数举例:2+3i。
复数表达式举例:F(x,y,... ...)=2+3i-sin[x-i]*ln[y]- ... ... 。
在复数表达式中不能使用 i 作为自变量,因为 i 已经用来表示虚数。
另外,FORCAL编译器在编译表达式时能进行两种形式的代码优化,其一是预先计算表达式中可以计算的部分,其二是采用格式4表示的数学表达式的可优化形式。
FORCAL将最大限度地进行第一种代码优化,但这种自动进行的优化并不彻底,若要获得最优化的代码,您需要将表达式中可以计算的部分用括号括起来(一般情况下不需要这样做)。
例如:要想进行彻底的第一种代码优化,需要将式子:
F(x,y)=x-5-7+y
写成:F(x,y)=x-[5+7]+y或F(x,y)=x+[-5-7]+y
需要注意的是,在进行第一种代码优化时,只有一级函数可以进行预先计算,二级函数的计算始终只能在编译后的表达式中进行。
FORCAL的第二种代码优化可以保证表达式中的任何相同部分只进行一次计算,从而最大限度地提高了计算速度。
在FORCALDLL.DLL 试用版中只有实数计算功能,计划在2003年初增加复数计算功能。
(二)、FORCAL的速度:
由于编译表达式所占的时间很少,所以这里只比较FORCAL与FORTRAN(或C/C++)的计算速度。
1、对纯数学表达式计算速度的比较
FORCAL是由FORTRAN(或C/C++)的编译程序生成的,所以它的速度要稍慢些,约为FORTRAN(或C/C++)的编译速度的50%左右。一般,表达式越长越复杂,FORCAL与FORTRAN(或C/C++)的计算速度就越接近。
2、综合比较
综合比较是指由FORCAL生成的实用程序和由FORTRAN(或C/C++)直接生成的实用程序的速度的比较。在实用程序中,除了计算表达式外,还有很多的算法处理,这使得它们之间的速度差别在缩小,毋庸质疑,算法处理所占的时间越长,它们的速度差别就越小。另外,启动FORTRAN(或C/C++)编译程序进行编译和出错调试等要占用一定的时间,这些时间要远比使用FORCAL进行同样的工作所用的时间要长。所以,综合来看,除了运算量特别巨大的程序,使用FORCAL要比使用FORTRAN(或C/C++)进行计算要快。
3、FORCAL的速度还能提高吗
回答是肯定的。因为FORCAL系统由编译和计算两部分组成,它编译数学表达式后的代码质量是非常高的,但目前使用的FORCAL由FORTRAN(或C/C++)生成,这使得FORCAL的计算代码中有些是不必要的,白白增加了执行时间。所以,如果FORCAL的计算部分用汇编语言来写,将能加快它的执行速度;如果让计算机的数学协处理器来执行FORCAL的计算部分,将能把FORCAL的计算速度推向极至。
(三)、FORCALDLL.DLL普及版与标准版的区别:
在普及版中FORCAL编译表达式的长度受到一定限制,除此之外,普及版与标准版没有任何区别。在一般的计算中,普及版是完全可以胜任的。但如果要使用很长的式子,则需要注册FORCALDLL.DLL标准版。标准版中最多允许使用长达32766个字符的数学表达式。
注意:您不能将您的软件连同FORCALDLL.DLL标准版一起发布,因为FORCALDLL.DLL标准版仅供个人使用。
(四)、FORCALDLL.DLL中的动态库函数说明:
(1)、版本信息函数:const char *ver(void) [序列号:1]。
(2)、表达式个数设置函数:bool setfornum(int m) [序列号:2]:
设置FORCALDLL.DLL可同时使用的表达式的个数为m个,设置成功函数返回true。可多次调用该函数。
注意:表达式从0开始编号,取值范围为0到m-1,编号为i的表达式称第i个表达式或者表达式i。
(3)、编译表达式:int rcom(int m,char a[],int &n) [序列号:3]:
编译第m个表达式a,返回的自变量个数为n个,当n=-1时表示有0个自变量,当n=0时表示有1个自变量,当n=1时表示有2个自变量,依次类推。
该函数返回值的意义如下:
0:表达式正确,编译通过;
1:不正确的运算方式;
2:无表达式;
3:自变量说明错,等号前有非法字符;
4:自变量应放在 ( ) 内;
5:非法自变量字符(以小写英文字母开头的小写英文字母与数字的组合);
6:自变量以小写英文字母开头;
7:自变量重复说明;
8:括号不成对;
9:在复数计算时,不能用 i 作为自变量(该返回值在编译复数表达式时使用);
10:不可识别函数名;
11:数学表达式太长,接近32766个字符;
12:不可识别自变量;
13:数字错误;
14:不可识别字符或一级函数有多个自变量;
15:内存分配失败;
16:二级函数错误;
17:符号定义错误或无表达式;
18:超出普及版允许的字符限制,请注册使用标准版。[在标准版中无此返回值]
(4)、计算表达式的值:double rcal(int m,double a[]) [序列号:4]:
计算第m个表达式的值,数组a中依次存放自变量。
(5)、释放动态库所申请的空间:void freedll(void) [序列号:5]。
(6)、动态库错误函数:int fcerr(char *&errname) [序列号:6]:
该函数在使用rcal或rcals函数后调用,返回动态库的第一个运行错误,fcerr返回错误类型,errname返回出错函数名,该函数被调用后,将把错误类型重新设置为0。
通常,可以在主程序中用int matherr(struct _exception *err)检测标准数学错误,用int fcerr(*&)检测FORCAL运行错误;特别地,可以用testdouble[或finite]和fcerr检测所有错误。
(7)、获得自变量数组指针函数:double *getin(int m) [序列号:7]:
该函数获得指向第m个表达式的自变量数组的指针,可用来输入自变量。
(8)、计算表达式的值:double rcals(int m) [序列号:8]:
计算第m个表达式的值,假定自变量已经通过自变量数组指针getin或getallin输入。该函数与getin或getallin配合使用,计算速度比rcal要快。
(9)、获得一维存储数组double的指针:double *getfcdoubles(long &n) [序列号:9]:
整数n返回该数组的大小。
(10)、获得多维存储数组doublearray的指针:double **getfcdoublearrays(long &n,long *&m) [序列号:10]:
整数n返回该数组的大小,m返回存放各维数组长度的整数组的指针。
(11)、设置可由FORCAL调用的外部函数:bool setfcfun(char **pch,int *n,double (**fun)(int k,double *dd)) [序列号:11]:
字符串表指针pch指出外部函数名,串表的最后应是一个空名