操作脚本计算不带括号的错误除法



给定这个类定义:

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,...这是怎么回事?

(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 无关。这是定义明确的数学规则。除法、乘法的优先级高于加法,减法和括号需要做加法,乘法前做减法、除法。

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

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

最新更新