乘法中的短路评估是否可行?

时间:2015-11-17 21:46:40

标签: java math operators shortcut arithmetic-expressions

假设我在Java中使用此代码:

    public static double function(double x, double y, int k) {
        return Math.pow(x, 2) + Math.pow(y, 2) + y + k*Math.sqrt(Math.pow(y, x));
}

它会在某个点(x,y)计算某个函数。 注意该平方根乘以整数k。有些情况下我会给k = 0(因为我不需要评估平方根)。它给出了我需要的值但是问题在于我正在编写时间敏感程序,即我将多次调用方法function。所以,我希望我的程序在Math.sqrt(Math.pow(y, x))时不会评估k = 0。 我用谷歌搜索了一下,但似乎并不是一个“短路”。算术的等价物(好吧,在许多情况下它甚至没有意义,乘法可能是一个排除)操作就像逻辑运算一样。

我怎样才能达到预期的效果?

3 个答案:

答案 0 :(得分:3)

我认为最后添加三元运算符将避免调用Math.sqrt(Math.pow(y, x))计算。如下图所示

 public static double function(double x, double y, int k) {
        return Math.pow(x, 2) + Math.pow(y, 2) + y 
             + ( k!=0 ?  k*Math.pow(y, x/2) : 0); //ternary operator here
}

答案 1 :(得分:2)

您可以通过

来实现此结果
k == 0 ? 0 : k*Math.sqrt(Math.pow(y, x))

这不等于

k*Math.sqrt(Math.pow(y, x))

虽然较短版本即使在NaN时也可以生成k == 0

答案 2 :(得分:2)

没有短路乘法运算符,因为数学不能正常工作。你能做的就像是

result = Math.pow(x, 2) + Math.pow(y, 2) + y;
if (k != 0)
    result += k*Math.sqrt(Math.pow(y, x));
return result;