最近在重新编写表达式解析过程时,仔细分析了一下各软件对成方运算结果差异的问题,分析如下: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,但把“-”的优先级至于“^”后)是否是一个合理的规则,请大家参与讨论,谢谢。

解决方案 »

  1.   

    我一般都加上括号处理
    Debug.Print 2 ^ ((-2) ^ (-2))
    Debug.Print (2 ^ (-2)) ^ (-2)
    Debug.Print 2 ^ (-2) ^ (-2)
    Debug.Print 2 ^ -2 ^ -2
    Debug.Print 2 ^ (-2) ^ -2
      

  2.   

    ?2^(-2)^-2
     16 ?(-2)^2
     4 ?(-2)^(-2)^-2
     16 ?2^(-3)^4^7
     5.16987882845642E-26
    我的理解是这样,“-”在表达式最前时,VB优先把它理解为负号,而在表达式中间时,VB优先把它理解为减号,不知是不是这么回事
      

  3.   

    你的到的结果都是对的,因为在EXCEL中,它是将一个格子中的数据一起计算的,这样的话
    -2 ^ 2  就相当于(-2)^2 
    而VB或其他任何的语言中则是按照字面的排列来计算的,这样的话
    -2 ^ 2  因为^优先级比-要高,就先做2X2再加个负号,于是就等于-4啦,其他几个也是这个道理