@dbardakovv

Есть ли разница для компьютера: x**3 или x*x*x?

Всем доброго времени суток. Помню мой преподавать с алгоритмизации и программирования, проверяя мой код, сказал не использовать возведение в степень "pow ()" а просто умножать переменную саму на себя (дело было на C++). На вопрос почему он ответил что так эффективнее, но не объяснил почему. В js есть оператор "**", и мне стало интересно действительно ли так. Может кто-то знает правда ли это, и если да, то почему? Зарание спасибо.
  • Вопрос задан
  • 788 просмотров
Решения вопроса 1
gbg
@gbg Куратор тега Программирование
Любые ответы на любые вопросы
Для таких вопросов есть специальный инструмент.

Препод прав.

При возведении в маленькую натуральную степень (2-30) компилятор может использовать векторные инструкции и получить результат очень быстро.

При использовании pow() происходит вызов специальной подпрограммы (что является относительно медленным делом), которая делает гораздо больше арифметических действий ( и работает только с числами с плавающей запятой, что потребует преобразования int->double )
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Tiriet
x*x*x скорее всего будет транслирована в три умножения (в зависимости от флагов оптимизации и версии компилятора могут быть разные варианты, как именно по регистрам это все раскидано будет, но не суть). В любом случае, это относительно быстрые инструкции вещественного умножения (1 такт и латентность 3-4).
pow(x,y) обычно реализована exp(y*ln(x)), и транслирована она будет с использованием инструкций fyl2x (ln2(x)) и f2xm1 (2^^x -1). а вот инструкции логарифма и экспоненты- это оооочень медленные инструкции, у логарифма под 50 тактов на исполнение и латентность больше сотни (под 150), у экспоненты- тактов под десяток и латентность порядка 30 (понятно, что у разных архитектур- числовые значения разные, но порядок величин- такой). А если ваша pow вызывается редко (а она обычно редко вызывается относительно других вычислений)- то работать она будет мало того что долго по собственно тактам исполнения, так еще и со всеми возможными штрафами к производительности. для сравнения- fmul (вещественное умножение) имеет латентность 4 и выполняется за 1 операцию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы