我正在寻找最快的方法来平方双(double d)。到目前为止,我想出了两种方法:

1. d*d
2. Math.pow(d, 2)

为了测试性能,我设置了三个测试用例,在每个用例中,我使用相同的种子为这三个用例生成随机数,并在循环中计算平方数100000000次。

在第一个测试用例中,编号是使用random.nextDouble()生成的,在第二个用例中,编号是使用random.nextDouble()*Double.MAX_VALUE生成的,而在第三个测试中,使用random.nextDouble()*Double.MIN_VALUE生成的。

几次运行的结果(近似结果,总会有一些变化,使用Java 1.8运行,在Mac OSX Mavericks上针对Java 1.6编译)
Approach | Case 1 | Case 2 | Case 3
---------•--------•--------•-------
    1    | ~2.16s | ~2.16s | ~2.16s
    2    | ~9s    | ~30s   | ~60s

结论似乎是方法1更快,但是Math.pow似乎有点怪异。

所以我有两个问题:
  • 为什么Math.pow这么慢,为什么对> 1的处理不好,而对< -1的数字更糟?
  • 有没有一种方法可以比我建议的方法1提高性能?我在想类似的东西:
    long l = Double.doubleToRawLongBits(d);
    long sign = (l & (1 << 63));
    Double.longBitsToDouble((l<<1)&sign);
    

  • 但这是a)错误的,b)速度与方法1相同。

    最佳答案

    对数字求平方的最快方法是将其自身相乘。



    确实不是,但是它执行的是exponentiation而不是简单的乘法。



    首先,因为它进行数学运算。在Javadoc中,它还包含针对许多极端情况的测试。最后,我不会太依赖您的微基准测试。

    09-27 09:28