东北林业大学环境科学系 隋祥
引言
表达式解析是编程工具与电子表格等软件最基本的功能之一,不同的软件在解析表达式时都遵循一定的运算规则,在不同软件中,这些运算规则略有差异,导致计算结果也不同。笔者在实践中发现, VB 与 Excel 在处理“连续乘幂”这一常见运算时,所遵循的法则有着较大的出入,而且都存在着不合理的因素。本文试图通过论述得到一种更为合理的运算模式,并为编写表达式解析类过程提供指导。
问题分析
下表列出了 VB6.0 与 Excel2003 在处理同一个关于乘方运算的表达式时所得到的结果。
** 表 1 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 理解为 ,那么,显然 VB 的计算结果是合理的,但是不是 VB 在处理连续乘方运算时都是从右到左的呢?答案是否定的。在计算 2^3^4 时, VB 得到的结果是 4096 而不是 2.41785163922926E+24 ,这说明此时 VB 并没有把 2^3^4 理解为
而是理解为
,是从左到右的结合顺序。显然, 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 与 Excel 在解析表达式时对乘幂运算的结果差异及所存在的不合理性,建议在编写表达式解析过程时应当遵循如下原则:
1. 建议将乘幂运算符“ ^ ”的优先级至于单目负数运算符“ - ”之前。
2. 在连乘幂运算的结合顺序上应当统一,建议采用从左到右的结合方式。
欢迎大家批评指正。