给定这个类定义:
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_A
,helper_
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;