User Tag List

Страница 19 из 34 ПерваяПервая ... 151617181920212223 ... ПоследняяПоследняя
Показано с 181 по 190 из 331

Тема: Вычисление числа Пи на ассемблере

  1. #181

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В википедии есть очень симпатичный алгоритм, N=100 цифр можно вычислить за S=6 шагов, а N=1000 за S=9. Из сложных операций на каждом шаге требуется одно умножение и корень. Еще одно умножение и деление нужно чтобы получить Пи, и один корень для инициализации. То есть требуется одно деление, S+1 умножение и S+1 корень. Что касается деления, то его можно заменить умножением на обратную величину вычисляемую по итеративной формуле типа x=x*(2-x*y) за log(N) шагов. Начинать можно с некоторого приближения x0, на каждой итерации количество верных цифр будет удваиваться, полное умножение NxN потребуется только на последнем шаге, а все предыдущие итерации по времени выполнения примерно равны еще одному умножению. То есть финальное деление примерно эквивалентно 4 умножениям. Что касается корней, то 1/корень можно вычислить используя итеративную формулу x=x*(3-x*x*y). Здесь три умножения, добавив еще 1.5 на предыдущие итерации, и 1 чтобы получить корень, получим что корень эквивалентен 5.5 умножениям, в итоге получается что для 100 цифр требуется примерно 50 умножений, а для 1000 примерно 70. Возможно что для деления и корня есть и более простые варианты. Хорошо бы конечно делать умножения методом Карацубы, но 100 и 1000 десятичных цифр занимают не очень круглое количество байт и не факт, что дробление блоков и лишние проверки не дадут фору какому-либо более примитивному алгоритму.

  2. #181
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #182

    Регистрация
    16.11.2015
    Адрес
    г. Москва
    Сообщений
    234
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    46
    Поблагодарили
    34 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от perestoronin Посмотреть сообщение
    А про бизнес-приложения и говорить не приходится
    Помню, как-то сгоряча переписал пару функций из бизнес-логики на асме, благо на Дельфи это легко делалось. Потом проследил всю цепочку вызовов и понял, что сэкономил пару микросекунд, в то время как дальше (не в моем коде) шел SQL запрос, выполнявшийся минимум 50 миллисекунд

  4. #183

    Регистрация
    25.11.2011
    Адрес
    г. Красногорск
    Сообщений
    1,389
    Спасибо Благодарностей отдано 
    16
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    Аналогично, могу предположить, и на Бейсиках можно найти такие задачи, которые асму будут не по зубам.

    Но у нас то, самая что ни на есть задачка для ассемблеров - расчет числа Пи

    Для решения этой задачи нам нужно три специалиста: оптимизаторы кода (есть как минимум трое), кодировщики (способные изложить алгоритм в коде, такой пока замечен только один) и математики (способные удачно подбирать, а если повезет то и открывать новые, алгоритмы под конкретные железки).

    Ждем помощи математиков.
    Последний раз редактировалось perestoronin; 29.12.2015 в 20:51.

    Ретрокладовая продажи

    продажи
    [свернуть]

  5. #184

    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,926
    Спасибо Благодарностей отдано 
    105
    Спасибо Благодарностей получено 
    291
    Поблагодарили
    217 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от blackmirror Посмотреть сообщение
    В википедии есть очень симпатичный алгоритм, N=100 цифр можно вычислить за S=6 шагов, а N=1000 за S=9.
    Ну да, а шаги эти включают работу с числами с плавающей точкой, для 100 знаков минимум 45 байт мантиссы, для 1000 - 450. И при этом, вычисление квадратного корня нужно будет в такой длинный ряд разложить (чтобы была нужная точность), что считаться он будет на 8-ми битках вечность. Реализованные в этой теме алгоритмы использовали лишь 16/32 битные числа.

  6. #185

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Потер два предыдущих поста насчет оптимизации деления для z80 и 8085.
    В итоге лучший вариант такой: в финальной версии для вектора не трогаем de, а меняем знак самого bc. Фрагменты "jnc DIV0_1\ dad h\ inr l" меняем на adc hl,hl или xchg\ rdel\ xchg. dad d меняем на dad b, а dad b меняем на sbc hl,bc или dsub. Лишнее убираем - древовидность становится не нужна и размер резко сокращается. Также отпадает необходимость в самомодифицирующемся коде (в процедуре деления). Такие версии показывают практически одинаковое быстродействие.

  7. #186

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,701
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Так а где сам исходник самого быстрого в мире Пи и деления для Z80?)

  8. #187

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    b2m
    Для 1000 цифр хватает мантиссы в 420 байт, если длина мантиссы M, а целая часть в нулевом байте, то при перемножении чисел A и B, можно не перемножать байты A[i] и B[j] если i+j>M, в этом случае из-за неучтённых переносов мы теряем только 3-4 младших байта.
    Что касается вычисления X=1/Y, то имея приближение X=1/Y+R, где |R|<2^-n, и сделав итерацию x=x(2-xy), получаем X=(1/Y+R)(2-(1/Y+R)*Y)=(1/Y+R)(1-R*Y)=1/Y-R*R*Y, и если Y<1, то ошибка станет менее 2^-2n, иными словами количество верных цифр удваивается. Если Y>1, то можно на предыдущем шаге обрабатывать не половину цифр, а чуть больше. К примеру использовать умножения 45x45, 23x23, 12x12, 7x7 и так далее. С обратным корнем ситуация аналогичная, только умножений там чуть больше.

  9. #188

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Деление 32/16=(16;16) для z80 div320_z80_correct2.zip
    Легко адаптируется для 8085 - меняем adc hl,hl на xchg\ rdel\ xchg, sbc hl,bc на dsub.
    Или для 580ВМ1 - меняем adc hl,hl на cs\ dad h, sbc hl,bc на dsub b.

    - - - Добавлено - - -

    При необходимости можно еще добавить в начале изменение знака bc.

    UPD: заменил архив - добавил "выпавший" adc a,a. У меня эта процедура в программе в мнемониках 8080 (коды z80 в виде .db), команда выпала при переводе мнемоник 8080->z80.

    UPD2: ёпрст, вроде НГ не начался, а пришлось еще раз исправлять

    - - - Добавлено - - -

    Еще вариант для 8085 - div320_8085.zip
    Эту процедуру просто скопировал из программы, ничего не менял, поэтому ошибок сразу нет.
    Последний раз редактировалось ivagor; 31.12.2015 в 10:07. Причина: убрал оценки быстродействия

  10. #189

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,701
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Деление 32/16=(16;16) для z80 div320_z80_correct2.zip
    А чего там в какой-то предыдущей версии стек использовался, а тут нет?

  11. #190

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если речь про использование dad sp (add hl,sp), то оказалось, что без этого можно обойтись и без sp будет даже быстрее (при данной разрядности).
    Для z80 можно с использованием sp апгрейдить эту процедуру до получения 32битного остатка. Младшие байты делимого при этом придется тасовать самомодифицирующимся кодом, как в версии для 8080. Зато можно увеличить и разрядность делимого и довести процедуру, например, до 64/32=(32;32)
    С другой стороны для расчета пи в пределах первых тысяч знаков это не особо нужно. Если использовать формулу Гаусса, то хватит даже 16 битных процедур (но вроде знаковых, надо уточнить) для расчета 4000 с чем-то знаков (в этой теме про это упоминал).

    - - - Добавлено - - -

    Цитата Сообщение от ivagor Посмотреть сообщение
    но вроде знаковых, надо уточнить
    Уточнил - достаточно беззнакового деления и умножения.
    Последний раз редактировалось ivagor; 30.12.2015 в 19:25.

Страница 19 из 34 ПерваяПервая ... 151617181920212223 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Арифметические процедуры на ассемблере
    от spensor в разделе Программирование
    Ответов: 27
    Последнее: 13.05.2017, 20:56
  2. Мнемокоманды и числа.
    от ALKO в разделе Программирование
    Ответов: 0
    Последнее: 15.02.2014, 03:49
  3. try-catch на ассемблере z80
    от siril в разделе Программирование
    Ответов: 22
    Последнее: 30.10.2012, 21:17
  4. Определение числа сторон
    от mungo в разделе Внешние накопители
    Ответов: 1
    Последнее: 16.03.2012, 18:06

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •