Мне было интересно, если exp()
быстрее, чем общее число pow()
. Я быстро запускаю тест на JsPerf http://jsperf.com/pow-vs-exp, и он показал интересные результаты для меня.Pow() vs. exp() performance
Math.exp(logBase * exponent); // fastest
Math.exp(Math.log(base) * exponent); // middle
Math.pow(base, exponent); // slowest
Я знаю, что результаты будут сильно отличаться от архитектуры и языка, но меня также интересует теоретическая точка зрения. Is pow(a, b)
реализован как exp(log(a) * b)
или есть еще более умный способ, как вычислить силу «прямо» (в C++, C# или JavaScript). Существуют ли инструкции процессора для exp, log или pow на некоторых архитектурах?
Насколько я знаю, и 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 конкретно? –