2

给定这个类定义:

package {
  public class Calc {
    public static function I(i:Number, s:Number):Number {
      var A:Number = helper_A(s);
      var B:Number = helper_B(s);
      var C:Number = helper_C(s);      
      return A * i + (Math.exp(B * i + C) - Math.exp(C) / B);
    }   
  }
}

静态函数helper_Ahelper_B 和helper_C做一些数学运算(带有基本计算的单行代码和Math.pow())。

当用

trace(Calc.I(27, 1985));

返回语句中括号位置的以下差异如何function I影响计算结果?


这个版本 1)

      return A * i + (Math.exp(B * i + C) - Math.exp(C) / B);

痕迹0.01721552341268775


虽然这个版本 2)

      return A * i + ((Math.exp(B * i + C) - Math.exp(C)) / B);

痕迹0.017092065919602526


据我所知,数学上的结果应该是相同的。Actionscript/Flash 怎么会在没有括号的情况下计算出错误的结果?是否有一些奇怪的内部缓存、顺序、内存、foobar ......这里发生了什么?

4

2 回答 2

4

(Math.exp(B * i + C) - Math.exp(C) / B);

首先执行不带括号Math.exp(C) / B的除法,因为除法/的优先级高于减法-

((Math.exp(B * i + C) - Math.exp(C)) / B);

这里(Math.exp(B * i + C) - Math.exp(C))由于括号的原因先执行,然后结果除以B。这和第一个版本明显不同。

这与 AS3 无关。这是定义明确的数学规则。除法,乘法的优先级高于加法,减法和括号需要在乘法,除法之前进行加法,减法。

于 2013-01-21T11:54:20.880 回答
0

检查运算符的优先级,顺便说一句,您不需要外括号:

return A * i + (Math.exp(B * i + C) - Math.exp(C)) / B;
于 2013-01-21T11:58:00.003 回答