我正在寻找最快的方法来平方双(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
的数字更糟? long l = Double.doubleToRawLongBits(d);
long sign = (l & (1 << 63));
Double.longBitsToDouble((l<<1)&sign);
但这是a)错误的,b)速度与方法1相同。
最佳答案
对数字求平方的最快方法是将其自身相乘。
确实不是,但是它执行的是exponentiation而不是简单的乘法。
首先,因为它进行数学运算。在Javadoc中,它还包含针对许多极端情况的测试。最后,我不会太依赖您的微基准测试。