Что вычисляется быстрее,


10

Что вычисляется быстрее, или или ? , и - положительные вещественные числа с .aбжурналaссбaбсб>1

Какие алгоритмы вы будете использовать при сравнении? Каковы их сложности?

Например, когда илисaбсaб

Этот вопрос был вдохновлен комментариями на вопрос об обмене стека математики. Какова цель приближения Стирлинга к факториалу? , Особенно те комментарии, которые оставили mjqxxxx , Томас Эндрюс и я.


Модераторы также, видимо, одобряют изменения. Я согласен с предложением @ MarkBooth и включил его в вопрос, как он предложил.
Арон Ахмадиа

Не стесняйтесь убирать (удалять) комментарии теперь, когда они выполнили свою задачу. * 8 ')
Марк Бут

Ответы:


8

Смотрите мой ответ на этот вопрос для некоторых связанных вопросов.

В общем, компьютеры могут только складывать, вычитать, умножать, делить и сдвигать биты. В качестве аргумента давайте предположим, что вы не вычисляете в особом случае, когда a - степень 2, а b - натуральное число, потому что этот случай сводится к сдвигу в битах, и, следовательно, это легко.aбaб

Если натуральное число, и вы хотите вычислить a b , вы можете использовать возведение в степень сложения . Любой другой случай в вашем вопросе сложен (в общем).бaб

Некоторые быстрые алгоритмы, используемые для приближения этих функций к высокой точности, требуют черной магии. Чтобы понять, что я имею в виду под «черной магией», взгляните на этот пост в блоге Мартина Анкерла и связанную с ним статью, на которую он ссылается в разделе « Нейронные вычисления» . Также см. Алгоритм CORDIC .

Подобные виды хитрых трюков объясняются в «Восхищении Хакера» (ссылка на сайт-компаньон для книги).

Другие способы вычисления хороших приближений используют численный анализ (см. Статью в Википедии о теории приближений ). Один плохой способ сделать это - создать соответствующее дифференциальное уравнение и интегрировать его, используя численный метод, такой как метод Эйлера (как я уже сказал, плохое приближение, но вы можете сделать это). Лучший способ сделать это - использовать последовательные приближения. Ряд Тейлора сходится слишком медленно, поэтому вместо него можно использовать что-то вроде аппроксимации Паде или некоторого другого типа приближения быстро сходящихся рядов (другие рациональные приближения, ряды Чебышева и т. Д.).

Алгоритм, который вы используете для аппроксимации вышеуказанных функций, будет зависеть от вашей архитектуры, требований к скорости и требований к точности.

Проблема разговоров о сложностях заключается в том, что любой алгоритм рассчитывает только аппроксимацию с плавающей точкой тех функций, которые вы упомянули, поэтому время выполнения, безусловно, будет зависеть от точности, которую вы требуете от своего приближения. Даже принимая это во внимание, я не думаю, что вычислительная сложность является хорошим первым приближением производительности; размер ваших входов будет измеряться в битах (т. е. количество битов, которое требуется для представления , b и c)aбс), которые будут зависеть от точности, а не от величин самих числовых входов. Для практических целей точность числового представления чисел не будет сильно различаться (одинарная точность, двойная точность, квадратическая точность), и вы обычно не решаете использовать эту точность на основе каких-либо оценок сложности вычислений скалярных функций , Наиболее актуальным показателем является время по настенным часам, и если вы не используете специальную архитектуру (встроенные системы) или ваше приложение действительно не требует быстрой экспоненты (см. Ссылку на пост в блоге и ссылку на нейронные вычисления выше), встроенные библиотеки в вашем Язык выбора, вероятно, просто отлично.


4

Это хороший вопрос, потому что понимание численных алгоритмов и производительности является важной предпосылкой для того, чтобы быть эффективным вычислительным ученым. В то же время, это плохой вопрос, потому что установленные ограничения недостаточно квалифицируют его, чтобы дать значимый ответ.

Производительность трех вычислений будет сильно зависеть от точности, необходимой в конечном результате, а также от минимальной точности, необходимой для представления операндов. Вы квалифицируете , b и c как положительные действительные числа, но нам также нужно знать, сколько двоичных цифр d n требуется для их точного представления. Чтобы понять соображения производительности для общих действительных чисел, мы сначала должны понять, как компьютеры представляют целые числа, а также как они аппроксимируют действительные числа, используя числа с плавающей запятой.abсdN

Когда компьютеры работают с целым числом , тогда необходимое количество двоичных цифр, очевидно, равно log 2 величины целого числа плюс дополнительный бит для обработки знака:M2

log 2 | М | + 1dNзнак равно2|M|+1

Например, число -8 может быть представлено 4 двоичными цифрами. Для повышения производительности и эффективности использования пространства арифметико-логические единицы (АЛУ), отвечающие за численные вычисления целых чисел на современных процессорах, предназначены для обработки математических вычислений с целыми числами вплоть до некоторого фиксированного размера, наиболее распространенными в наши дни являются d = 32 и d = 64. Не только процессоры x86, как на вашем компьютере, имеют ALU, они являются фундаментальным строительным блоком компьютерной архитектуры, повсеместной в современном электронном обществе. Если вы знакомы с игровыми приставками, вы, возможно, помните Nintendo 64, систему видеоигр, названную по размеру (в битах), для которой были разработаны арифметико-логические устройства на процессоре консоли.

Целочисленные сложения, вычитания и умножения на арифметических логических единицах очень эффективны и обычно требуют не более нескольких циклов для вычисления. Деления менее производительны, и на современных процессорах может потребоваться до нескольких десятков циклов. Производительность зависит как от архитектуры блока обработки (и соответствующей реализации арифметико-логического блока), так и от его частоты. Обратите внимание, что 64-битный процессор обычно может выполнять арифметику с -битными операндами с одинаковой скоростью для x в любом месте от 1 до 64.ИксИкс

В общих вычислениях, и особенно в научных вычислениях, целочисленная математика является громоздкой для многих вычислений, и необходимо другое представление чисел, так называемое представление с плавающей запятой. Числа с плавающей запятой представляют собой компромисс между работой современных микропроцессоров (преобразование данных в битные фрагменты) и потребностями вычислений путем представления чисел на процессоре в усеченной научной нотации с использованием фиксированной базы b (обычно b = 2 или b = 10 ) и представляет число, используя два целых числа, мантиссу (значимую в некоторых кругах) s и показатель степени e . Данное число хNббзнак равно2бзнак равно10sеИкс тогда приблизительно представляется как:

Иксзнак равноs*бе

Я говорю примерно, потому что должно быть очевидно, что даже простые рациональные, такие как не может быть представлен точно как число с плавающей точкой для стандартных базисов. Количество цифр, зафиксированных в значении, определяет точность числа, которое относительно его собственной величины. СтандартIEEE 754определяет ряд правил поведения ожидаемых чисел с плавающей запятой, в том числе диапазоны значений и мантиссы (и соответствующий диапазон и точность) для нескольких важных значенийdn, так что численные вычисления могут повторяться в пределах некоторая терпимость. В том, как работают числа с плавающей запятой, есть некоторая тонкость, которую я не могу надеяться охватить в этом ответе. Для хорошего введения я рекомендую«Что должен знать каждый специалист по вычислительной технике об арифметике с плавающей запятой»13dN,

За последние 50 лет были вложены значительные интеллектуальные усилия в улучшение возможностей процессора для эффективного вычисления арифметических операций с плавающей запятой. На современных процессорах эти вычисления обрабатываются одним или несколькими блоками с плавающей запятой (FPU), более сложной версией арифметического логического блока, предназначенного для выполнения арифметических операций над числами с плавающей запятой и обычно предназначенного для обработки обоих указанных в IEEE 754 32 -битные числа с плавающей запятой (часто называемые «числами с плавающей запятой») и 64-битные числа с плавающей запятой (часто называемые числами с двойными числами) эффективно. Подобно арифметическим логическим единицам, единицы с плавающей запятой часто могут вычислять сложение, вычитание и умножение всего за несколько циклов, в то время как для деления обычно требуется немного больше.

В большинстве случаев для числовых вычислений достаточно 64-разрядных двойных чисел с плавающей точкой IEEE 754, поэтому давайте предположим, что , b и c представлены в виде 64-разрядных двойных чисел , и вас интересует производительность три вычисления в виде скалярных операций в архитектуре Intel Nehalem с использованием подмножества команд с плавающей запятой x87, т. е. вас не интересует вычисление этих операций в цикле for или для диапазона данных, и вы не хотите использовать векторные расширения , Информация о задержке команд собирается из превосходного набора справочных таблиц команд для архитектур Intel / AMD.aбс

  1. aб
  2. войти в грaс
  3. с1б

1 Общее возведение в степень часто осуществляется со следующей идентичностью:

aбзнак равноβaжурналβб

Где равно 2 или e (в этом случае я использую β = 2 ). Предполагая, что вы готовы отбросить некоторую точность результата (модуль x87 выполняет вычисления с точностью 80 бит, но этого недостаточно для определенных диапазонов значений a и b ), это вычисление можно выполнить с помощью аппаратной инструкции FYL2X. для вычисления t = a log 2 b и аппаратной инструкции F2XM1 (с некоторой помощью по масштабированию) для вычисления 2 t . Предполагая ~ 20 циклов для обработки масштабирования:β2еβзнак равно2aбt=alog2b2T

FYL2X + F2XM1 + ~ 20 = 80 + 51 + ~ 20 = ~ 151 циклов

2 Это может быть преобразовано в два логарифма и деление путем изменения базовой идентичности и не требует масштабирования для получения точного результата.

2 * FYL2X + FDIV = 2 * 80 + (от 7 до 27) = от 167 до 187 циклов

[3] Это эквивалентно делению с возведением в степень, поэтому [1] плюс FDIV ~ 175 циклов.


0

Позвольте мне посмотреть, могу ли я перефразировать вопрос:

aбжурналa(с)a

Ответ : это действительно зависит от того, имеет ли c какую-либо зависимость от a, и как a сравнивается с b (больше, меньше или равно).

сбa

сжурналa(с)знак равнопер(с)/пер(a)журналa(с)aбaaбзнак равноω(журналa(с))

сзнак равноaбжурналa(aб)знак равноббaбLогa(с)aбзнак равноω(журналa(с))

сaбaбсзнак равноΘ(aб)

журналa(с)с1/б

aбс

сс1/ббс1/бзнак равноо(журналa(с))

сзнак равноaбжурналa(с)знак равноaс1/бзнак равноaжурналa(с)знак равноΘ(с1/б)

сaбaбс

с1/бaб

сс1/бaбс1/бзнак равноо(aб)

сзнак равноaбс1/бзнак равноaб>1aбс1/б

aбс


Я разделю свои комментарии на две части: стилистическую и контентную. Стилистически, я ценю, что вы включили уравнения в свой пост. Пожалуйста, переформатируйте их, чтобы использовать MathJax, чтобы они хорошо отображались (как, например, в опубликованном вопросе). Чтобы воспользоваться MathJax, используйте обозначение LaTeX при написании ваших уравнений. Для начинающих по написанию математики в LaTeX, см. Это руководство в Wikibooks , или это краткое руководство Американского математического общества .
Джефф Оксберри

aбжурналсa
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.