Java 在乘法运算中是否可以进行短路计算?

Java 在乘法运算中是否可以进行短路计算?,java,math,operators,shortcut,arithmetic-expressions,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(因为我不需要求平方根)。它给出了我需要的值,但问题是我正在编写时间敏感的程序,即我将多次调用

假设我有以下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
(因为我不需要求平方根)。它给出了我需要的值,但问题是我正在编写时间敏感的程序,即我将多次调用方法
函数
。因此,我希望我的程序不会在
k=0时计算
Math.sqrt(Math.pow(y,x))
。 我在谷歌上搜索了一下,但似乎算术(在许多情况下,它甚至没有意义,乘法可能是一种排除)运算没有逻辑运算那样的“短路”等价物


我怎样才能达到预期的结果

我认为在末尾添加三元运算符将避免调用
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
}

我认为在末尾添加三元运算符将避免调用
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
}

您可以通过执行以下操作来实现此结果

k == 0 ? 0 : k*Math.sqrt(Math.pow(y, x))
这不等于

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

虽然较短的版本可以生成
NaN
,即使
k==0

,您也可以通过执行以下操作来实现此结果

k == 0 ? 0 : k*Math.sqrt(Math.pow(y, x))
这不等于

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

虽然较短的版本可以生成
NaN
,即使
k==0

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

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

不存在短路乘法运算符,因为数学不是那样工作的。你能做的就是

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

由于它是一个时间敏感的程序,您可能需要使用
k=0?k*Math.pow(y,x/2):0
,比
k快10%以上=0 ?  k*Math.sqrt(Math.pow(y,x)):0
在我的机器上。@Linus哦,是的。感谢您的输入。因为这是一个时间敏感的程序,您可能需要使用
k=0?k*Math.pow(y,x/2):0
,比
k快10%以上=0 ?  k*Math.sqrt(Math.pow(y,x)):0
在我的机器上。@Linus哦,是的。谢谢你的意见。