我想知道是否exp()
比更一般的更快pow()
。我在 JsPerf http://jsperf.com/pow-vs-exp上运行了快速基准测试,它显示了对我来说很有趣的结果。
Math.exp(logBase * exponent); // fastest
Math.exp(Math.log(base) * exponent); // middle
Math.pow(base, exponent); // slowest
我知道结果在架构和语言上会有很大差异,但我也对理论观点感兴趣。被pow(a, b)
实现为exp(log(a) * b)
或者是否有一些更聪明的方式如何“直接”(在 C++、C# 或 JavaScript 中)共同计算能力。在某些架构上是否有用于 exp、log 或 pow 的 CPU 指令?
据我所知,两者exp()
和log()
都是使用一些泰勒级数计算的,计算起来非常昂贵。这让我相信,对于恒定的权力基础,这段代码
double logBase = log(123.456);
for (int i = 0; i < 1024; ++i) {
exp(logBase * 654.321);
}
比这更好
for (int i = 0; i < 1024; ++i) {
pow(123.456, 654.321);
}
这是正确的假设吗?