Що обчислюється швидше,


10

Що обчислюється швидше, ab або logac або cb ? a,біc- позитивні значення приб>1.

Які алгоритми ви використовуватимете для порівняння? Які їх складності?

Наприклад, коли або c a bcабcаб

Це питання було натхнене коментарями до питання обміну стеками з математики Яка мета наближення Стірлінга до факторіалу? . Особливо, ті коментарі, які залишили mjqxxxx , Томас Ендрюс і я.


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

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

Відповіді:


8

Дивіться мою відповідь на це запитання щодо деяких суміжних питань.

Загалом, комп'ютери можуть лише додавати, віднімати, множувати, ділити та зсуву бітів. Заради аргументу, давайте припустимо , що ви НЕ обчислення в окремому випадку , коли є ступенем 2 і б є натуральне число, тому що йдеться тільки про брак битному зрушення, і тому легко.abab

Якщо це натуральне число, і ви хочете , щоб обчислити на б , ви можете використовувати додаток ланцюга зведення в ступінь . Кожен інший випадок у вашому запитанні важкий (загалом).baб

Деякі швидкі алгоритми, використовувані для наближення цих функцій до високої точності, вимагають чорної магії. Щоб побачити, що я маю на увазі під "чорною магією", погляньте на цю публікацію в блозі Мартіна Анкерля та пов'язаний з ним документ, на який він посилається в " Нейрових обчисленнях" . Також дивіться алгоритм CORDIC .

Подібні різновиди хитрощів, що розгортаються, пояснюються в заході Хекера (посилання на веб-сайт супутника книги).

Інші способи обчислення хороших наближень використовують чисельний аналіз (див. Статтю Вікіпедії про Теорію наближення ). Один з поганих способів зробити це - скласти відповідне диференціальне рівняння та інтегрувати його за допомогою числового методу, як метод Ейлера (як я вже сказав, поганий наближення, але ви можете це зробити). Кращий спосіб зробити це - використовувати наближення ряду. Серія Тейлора конвергується занадто повільно, тому може бути використане щось на зразок апроксимації Паде або якийсь інший тип наближення ряду швидко конвергуючих серій (інші раціональні наближення, ряд Чебишева тощо).

Алгоритм, який ви використовуєте для наближення функцій вище, залежатиме від вашої архітектури, вимог швидкості та вимог точності.

Проблема розмови про складності полягає в тому, що будь-який алгоритм збирається лише обчислити наближення плаваючої точки до функцій, про які ви згадуєте, тому час виконання, безумовно, буде залежати від точності, яку ви вимагаєте від наближення. Навіть враховуючи це, я не думаю, що обчислювальна складність є хорошим першим наближенням ефективності; розмір вхідних даних буде вимірюватися в бітах (тобто кількість бітів, необхідних для представлення , b і cabc), які будуть залежати від точності, а не залежно від величин самих числових входів. У практичних цілях точність чисельного представлення чисел не буде сильно відрізнятися (одинарна точність, подвійна точність, квадратологія), і ти зазвичай не вирішуєш використовувати цю точність на основі будь-яких оцінок складності обчислювальної функції скалярних функцій. . Найбільш релевантний показник - це настінний час, і якщо ви не використовуєте спеціальну архітектуру (вбудовані системи) або ваш додаток дійсно вимагає швидкої експоненції (див. Посилання в блозі та посилання Neural Computation вгорі), внутрішні бібліотеки у вашій мова на вибір, ймовірно, просто чудова.


4

Це гарне запитання, оскільки розуміння чисельних алгоритмів та продуктивності є важливою умовою бути ефективним вченим-обчислювачем. У той же час, це бідний питання , оскільки обмеження , як позувала мало кваліфікувати його , щоб дати змістовну відповідь.

Виконання трьох обчислень буде сильно залежати від точності, необхідної для кінцевого результату, а також мінімальної точності, необхідної для представлення операндів. Ви кваліфікуєте , b і c як додатні дійсні числа, але ми також повинні знати, скільки двійкових цифр d n потрібно, щоб їх точно представити. Щоб зрозуміти міркування щодо ефективності загальних реальних чисел, спершу нам потрібно зрозуміти, як комп’ютери представляють цілі числа, а також як він наближає реальні числа за допомогою чисел з плаваючою комою.abcdn

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

log 2 | М | + 1dn=2|M|+1

Наприклад, число -8 можна представити чотирма двійковими цифрами. Для ефективності та просторової ефективності арифметичні логічні одиниці (ALU), відповідальні за чисельні обчислення цілих чисел на сучасних одиницях обробки, призначені для обробки математики на цілі числа до певного фіксованого розміру, найбільш поширеними в ці дні d = 32 і d = 64. Не просто процесори x86, як у вашому комп’ютері, мають ALU, вони є фундаментальним складовим елементом архітектури комп'ютерів, всюдисущим у сучасному електронному суспільстві. Якщо ви знайомі з консолями відеоігор, ви можете запам'ятати Nintendo 64, систему відеоігор, названу за розміром (у бітах), арифметичні логічні одиниці на процесорі консолі, призначені для роботи.

Додавання, віднімання і множення цілих чисел на арифметичні логічні одиниці є дуже ефективними, і зазвичай для обчислення потрібно не більше декількох циклів. Підрозділи менш ефективні, і на сучасних процесорах може знадобитися аж кілька десятків циклів. Продуктивність залежить як від архітектури блоку обробки (і відповідної реалізації арифметичної логічної одиниці), так і від її частоти. Зауважте, що 64-розрядний процесор зазвичай може виконувати арифметику на -бітних операндах з однаковою швидкістю для x де-небудь між 1 і 64.xx

У загальних обчисленнях, особливо в наукових обчисленнях, ціла математика є непростою для багатьох обчислень, і потрібне інше представлення чисел, так зване представлення "плаваючої крапки". Числа з плаваючою комою представляють компроміс між тим, як працюють сучасні мікропроцесори (переносять дані навколо бітових груп) та потребами обчислення, представляючи числа на процесорі в усічених наукових позначеннях, використовуючи фіксовану базу b (як правило, b = 2 або b = 10 ) і представляє число за допомогою двох цілих чисел, мантіси (означальноїі в деяких колах) s та експонента e . Дане число xnbb=2b=10sex Тоді приблизно представлений як:

x=sbe

Я кажу приблизно тому, що має бути очевидним, що навіть прості раціоналісти, такі як не може бути представлено точно як число з плаваючою комою для стандартних баз. Кількість цифр, допущених до значенняі визначає точність числа, що відповідає його власній величині. СтандартIEEE 754визначає ряд правил щодо того, як очікується поведінка чисел з плаваючою комою, включаючи діапазони значень та мантіси (і відповідний діапазон та точність) для кількох важливих значеньdn, так що числові обчислення можна повторити в межах деяка толерантність. Існує досить багато тонкощів у тому, як працюють номери з плаваючою комою, які я не можу сподіватись зафіксувати у цій відповіді, для гарного вступу я рекомендую«Що повинен знати кожен комп'ютерний вчений про арифметику з плаваючою комою».13dn.

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

У більшості випадків 64-розрядні «парні точки» з плаваючою комою IEEE 754 є достатніми для чисельних обчислень, тому припустимо, що , b і c представлені як 64-бітні подвійні, і ви зацікавлені в ефективності три обчислення як скалярні операції в архітектурі Intel Nehalem з використанням підмножини інструкцій з плаваючою комою x87, тобто ви не зацікавлені в обчисленні цих операцій для циклу for або для діапазону даних, і ви не хочете використовувати векторні розширення . Інформація про затримку інструкцій збирається з відмінного набору довідкових таблиць інструкцій Agner Fog для архітектур Intel / AMD.abc

  1. ab
  2. log a cac
  3. c1b

1 Загальна експоненція часто реалізується з такою ідентичністю:

ab=βalogβb

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

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

2 Це може бути перетворено на два логарифми та поділ шляхом зміни базової ідентичності та не потребує перерахунку для точного результату.

2 * FYL2X + FDIV = 2 * 80 + (7-27) = 167-187 циклів

[3] Це еквівалентно поділу, що супроводжується експоненцією, тому [1] плюс FDIV, ~ 175 циклів.


0

Дозвольте мені побачити, чи можу я перефразовувати питання:

Випадок 1: Як б порівняти увійти в ( C ) , а прагне до нескінченності (асимптотический сенс)?abloga(c)a

Відповідь : це дійсно залежить від того, чи має c-залежність від a і як порівнюється з b (більший, менший або рівний).

Я перегляну деякі випадки, які ви вказали про взаємозв'язок , b і a :cba

cloga(c)=ln(c)/ln(a)loga(c)abaab=ω(loga(c))

c=abloga(ab)=bbabloga(c)ab=ω(loga(c))

cababc=Θ(ab)

loga(c)c1/b

abc

cc1/bbc1/b=o(loga(c))

c=abloga(c)=ac1/b=aloga(c)=Θ(c1/b)

cababc

c1/bab

cc1/babc1/b=o(ab)

c=abc1/b=ab>1abc1/b

abc


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

ablogca
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.