【发布时间】:2026-02-07 15:15:01
【问题描述】:
我正在寻找求双精度平方的最快方法 (double d)。到目前为止,我想出了两种方法:
1. d*d
2. Math.pow(d, 2)
为了测试性能,我设置了三个测试用例,在每个测试用例中,我使用相同的种子为这三个用例生成随机数,并在循环中计算平方数 100 000 000 次。
在第一个测试用例中,数字是使用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 的速度差不多。
【问题讨论】:
-
我没有参考,但我想我记得
Math.pow()只有在使用更大的指数时才有用。如果更简单的方法似乎更快地进行平方,为什么不坚持下去呢? -
random.nextDouble()在你的长循环中吗?如果是这样,您主要衡量的是那个,而不是d*d。 -
@MikeDunlavey 当然,这些数字在绝对测量中并没有多大意义,但由于在所有循环中生成的数字都是相同的,您可以进行比较
标签: java performance math multiplication