【问题标题】:Is short-circuit evaluation possible in multiplication?乘法是否可以进行短路评估?
【发布时间】:2016-02-19 10:55:36
【问题描述】:

假设我有这段 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。所以,如果k = 0,我希望我的程序不会评估Math.sqrt(Math.pow(y, x))。 我用谷歌搜索了一下,但似乎没有算术的“短路”等价物(嗯,在许多情况下,它甚至没有意义,乘法可能是一个排除项)操作,就像逻辑操作一样.

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

【问题讨论】:

    标签: java math operators shortcut arithmetic-expressions


    【解决方案1】:

    我认为在末尾添加三元运算符将避免调用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?k*Math.pow(y,x/2):0,它比我机器上的k!=0 ? k*Math.sqrt(Math.pow(y, x)) : 0 快​​10% 以上。
    • @Linus 哦,是的。感谢您的意见。
    【解决方案2】:

    你可以通过这样做来达到这个结果

    k == 0 ? 0 : k*Math.sqrt(Math.pow(y, x))
    

    这不等于

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

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

    【讨论】:

      【解决方案3】:

      没有短路乘法运算符,因为数学不能那样工作。你可以做的是像

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

      【讨论】:

        猜你喜欢
        • 2021-10-10
        • 2012-02-03
        • 2021-09-23
        • 1970-01-01
        • 2013-08-25
        相关资源
        最近更新 更多