exp()
がより一般的なものよりも速いのかどうか疑問に思っていましたpow()
。私はJsPerf http://jsperf.com/pow-vs-expで高速ベンチマークを実行し、私にとって興味深い結果を示しました。Pow()と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);
}
よりも優れていると信じています正しい仮定ですか?
これらのオプションのいずれかが他のものよりもはるかに正確であれば、私は驚くことはありません。 – delnan
私は約2-5%の誤差があります。何度かテストを実行してみてください。しかし、ベンチマークは完璧ではありません。だからこそ私はこの背後にある理論に興味があります。また精度も面白い質問です。 – NightElfik
これは本当に実装の詳細に依存します。 JavaScriptに関する質問は具体的ですか? –