讨论:关于表达式解析乘方运算规则的问题(VB与Excel好像都不是很合理)
最近在重新编写表达式解析过程时,仔细分析了一下各软件对成方运算结果差异的问题,分析如下:
VB6.0与Excel2003在处理同一个关于乘方运算的表达式时所得到的结果不同之处如下:
表达式 VB计算结果 Excel计算结果
2^-2^-2 .840896415253715 16
-2 ^ 2 -4 4
-2^-2^-2 -.840896415253715 16
2 ^ -3 ^ 4 ^ 7 0 5.16988E-26
本人认为引起结果差异的主要因素是单目运算符“-”的运算级和连续乘幂的运算顺序。
1.对于表达式2^-2^-2,VB的计算步骤是2^(-2^-2)= .840896415253715,这时它的计算顺序是从右到左,而Excel则严格按照从左到右的结合顺序。如果我们把2^-2^-2理解为2 -2(上标)-2(上标的上标),那么,显然VB的计算结果是合理的,但VB在在计算2^3^4时,VB得到的结果是4096而不是2.41785163922926E+24,这说明此时VB是从左到右的结合顺序。显然,VB在处理乘方运算时,其结合顺序没有一个令人信服的依据,并存在不合理性。
2.对于表达式-2^2,VB的计算过程相当于-(2^2)=-4,按照Microsoft MSDN 6.0 简体中文版VB帮助系统中的《运算符优先顺序》一文中的描述,指数运算符(^)高于负数运算符(-)。这样看来VB按照这样的法则得到这样的结果是合理的。对于Excel,它的计算过程相当于(-2)^2,按照Excel 2003版帮助文档的叙述,符号(-)要高于乘幂(^)(注:两款软件运算符的中文名称略有差异),那么这样看来Excel的运算也是合理的。但是Excel将“-(负号)”的优先级放在“^”运算符之前的做法存在着一定问题。例如对于表达式4-2^2、4--2^2、4---2^2、4-……-(n个-)2^2的结果都是0,这是按照上述法则令人无法顺利解释的。
3.由于上述两条原因才导致了对于表达式-2^-2^-2的计算结果的不同。
4. 对于表达式2 ^ -3 ^ 4 ^ 7,VB计算结果为0,有可能是VB认为值比较小就规定为零?
顺便说一下,金山ET2003的规则是严格从右到左的。也就是说VB/Excel/金山表格的算法都不一样。处理同一个乘方运算表达式将得到不同结果。
那么,我编写表达式解析过程应该遵照何种法则处理连续乘方运算?哪个更合理,按照传统的自左至右的结合(类似Excel,但把“-”的优先级至于“^”后)是否是一个合理的规则,请大家参与讨论,谢谢。