java - 类似于 a^b 的快速函数

标签 java performance function pow

这有点晦涩,但我需要一个可以非常快速地计算并且类似于 a^b 的函数,其中 a 在 0 和 1 之间并且 b 非常大。对于许多 b,它将一次计算一个 a。理想情况下,结果将在 0.4% 以内。提前致谢。

最佳答案

将我的评论转化为答案:

既然您提到 b 足够大,可以四舍五入为整数,那么一种方法是使用 Binary Exponentiation algorithm通过平方。

Math.pow() 很慢,因为它需要处理非整数幂。因此,在您的情况下可能会做得更好,因为您可以利用整数幂算法。


一如既往,对您的实现进行基准测试,看看它是否真的比 Math.pow() 更快。​​


这是 OP 发现的一个实现:

public static double pow(double a, int b) {
    double result = 1;
    while(b > 0) {
        if (b % 2 != 0) {
            result *= a;
            b--;
        } 
        a *= a;
        b /= 2;
    }

    return result;

}

这是我的快速(未优化)实现:

public static double intPow(double base,int pow){
    int c = Integer.numberOfLeadingZeros(pow);

    pow <<= c;

    double value = 1;
    for (; c < 32; c++){
        value *= value;
        if (pow < 0)
            value *= base;
        pow <<= 1;
    }

    return value;
}

这应该适用于所有积极的 pow。但我没有将它与 Math.pow() 进行基准测试。

关于java - 类似于 a^b 的快速函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12541410/

相关文章:

java - 当 JVM 使用 for-each 循环迭代数组时,它会创建迭代器吗?

c# - 包含比 StartsWith 快?

javascript - 有多少种方法可以查看您手动添加到函数的所有属性? JavaScript。 JS

java - configuration.yml 出现错误 : * Unrecognized field at: driverClass - DROPWIZARD

java - 如何实现xxx.domainname.com URL模式?

java - 测试用例后使用SQL回滚,但被测方法使用commit

opengl - 在OpenGL中绘制许多球体

java - kafka如何平衡分区负载?

c++ - 使用函数读取文件.txt中的矩阵

javascript - 当 Controller 中的 $scope 值更改时,$scope 值不会在 View 中更新