User Tag List

Страница 8 из 16 ПерваяПервая ... 456789101112 ... ПоследняяПоследняя
Показано с 71 по 80 из 155

Тема: Генерация синуса

  1. #71

    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,089
    Спасибо Благодарностей отдано 
    281
    Спасибо Благодарностей получено 
    70
    Поблагодарили
    49 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Reobne Посмотреть сообщение
    Привет!
    Реализовал синус многочленом.
    ...
    Коэффициенты подобрал методоми "научного тыка" и "искусственного отбора".
    Какого порядка многочлен? Было лень детально анализировать твой код, но кажется, что многочлен 3-го порядка?

    Коэффициенты для таких многочленов надо подбирать не генетическими алгоритмами, а методом Ремеза. Минимакс-аппроксимация. Кстати, в этой теме я приводил коэффициенты минимакс-многочлена 3й степени для приближения синуса (или косинуса).
    Цитата Сообщение от Reobne Посмотреть сообщение
    Отклонение abs(SINTAB[X]-sin(X*PI/128)*127.5) не превышает 0.503. Это очень близко к идеальному 0.5
    Вот это круто. Один лишний байт кода - зато существенно выше точность. Спасибо!
    Цитата Сообщение от Reobne Посмотреть сообщение
    а значит у него другой потенциал оптимизации.
    О да. У тебя там, смотрю, 16-битная арифметика реализована с применением jr c. Обычно от этих команд можно избавиться. Посмотри в мой синус, как там сделано. Например, условное увеличение или уменьшение на 1 можно реализовать командами вида ADC A,0 или ADC A,-1.

    ---------- Post added at 12:59 ---------- Previous post was at 12:55 ----------

    Цитата Сообщение от drbars Посмотреть сообщение
    Быстро, без таблиц
    Это взаимоисключающие условия. Если без таблиц - значит с умножением, а умножение без таблиц быстрым не бывает.

  2. #72

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,103
    Спасибо Благодарностей отдано 
    1,336
    Спасибо Благодарностей получено 
    323
    Поблагодарили
    152 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Какого порядка многочлен? Было лень детально анализировать твой код, но кажется, что многочлен 3-го порядка?
    Смотрим алгоритм(я его для наглядности и написал): A - меняется линейно, DE - квадратично, BC - третья степень, HL - четвёртая. H идёт в таблицу, значит многочлен 4-й степени.

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Коэффициенты для таких многочленов надо подбирать не генетическими алгоритмами, а методом Ремеза.
    Эти методы ближе к непрерывным функциям, а у нас тут сплошная дискретика. И по аргументу и по значению. Эволюции-же дискретность только на руку: меньше вариантов мутаций и быстрее вычисления для отбора.
    Вот если-бы в проце было аппаратное умножение с плавающей точкой, но не было синуса, тогда да. И без таблиц.
    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    О да. У тебя там, смотрю, 16-битная арифметика реализована с применением jr c. Обычно от этих команд можно избавиться. Посмотри в мой синус, как там сделано. Например, условное увеличение или уменьшение на 1 можно реализовать командами вида ADC A,0 или ADC A,-1.
    Да, спасибо, можно будет как-нибудь попробовать. Придётся перелапатить код(или переписать совсем), чтобы в нужный момент старший байт был в A. Может чего и оптимизируется.

  3. #73

    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,089
    Спасибо Благодарностей отдано 
    281
    Спасибо Благодарностей получено 
    70
    Поблагодарили
    49 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Reobne Посмотреть сообщение
    Эти методы ближе к непрерывным функциям, а у нас тут сплошная дискретика. И по аргументу и по значению.
    Дискретика? Ничего, что синус - непрерывная функция? Кроме того, алгоритм Ремеза - это обобщение на непрерывный случай менее известного r-алгоритма, который отыскивает наилучшее приближение функции по Чебышеву (минимум максимального отклонения) на дискретном наборе точек. Причем, в отличие от алгоритма Ремеза, который хоть и сходится быстро, но никогда 100% точно, r-алгоритм находит решение за конечное число операций. См. Демьянов, Малоземов "Введение в минимакс".

    Другое дело, что в силу конечной точности представления аргумента и результата, иногда бОльшая точность достигается при таких коэффициентах аппроксимирующего многочлена, которые слегка отличаются от тех, которые оптимальны для случая бесконечной точности вычислений. Я читал недавно статью на эту тему. Не помню уже, какие методы там применялись, но по идее, можно пытаться "эволюционно" уточнять решение, которое было первоначально получено по Ремезу.
    Цитата Сообщение от Reobne Посмотреть сообщение
    Придётся перелапатить код(или переписать совсем), чтобы в нужный момент старший байт был в A. Может чего и оптимизируется.
    Не обязательно, чтобы старший байт был в A. Например, такая конструкция:
    SBC A,A
    ADD A,D
    LD D,A
    условно уменьшает регистр D на 1 за 12 тактов и 3 байта кода.

  4. #74

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,103
    Спасибо Благодарностей отдано 
    1,336
    Спасибо Благодарностей получено 
    323
    Поблагодарили
    152 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию антианонс

    Спасибо за подсказки, но что-то у меня не получается выручить хотя-бы байтик, а переписать всё с нуля не хватает мотивации.

  5. #75

    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,089
    Спасибо Благодарностей отдано 
    281
    Спасибо Благодарностей получено 
    70
    Поблагодарили
    49 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Reobne Посмотреть сообщение
    Спасибо за подсказки, но что-то у меня не получается выручить хотя-бы байтик, а переписать всё с нуля не хватает мотивации.
    Ну ладно. Может быть когда-нибудь я сам засяду за оптимизацию. Можно еще вопрос по поводу дискретики? Алгоритм уже весьма оптимизирован - ведь в нем нет умножений, которые обычно характерны для многочленов. Получается, что на коэффициенты многочлена накладываются серьезные ограничения? Чему равны эти коэффициенты в опубликованной тобой программе?

  6. #76

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,103
    Спасибо Благодарностей отдано 
    1,336
    Спасибо Благодарностей получено 
    323
    Поблагодарили
    152 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Получается, что на коэффициенты многочлена накладываются серьезные ограничения? Чему равны эти коэффициенты в опубликованной тобой программе?
    Многочлена в программе уже нет. Многочлен был прообразом.
    То есть, образно говоря, ты хочешь узнать каким сортом овса я кормлю свой велосипед! Даже если конь идейно породил велосипед, всё равно велосипед уже не конь и овса не ест. Так и в моей программе многочлена уже давно нет, а есть сумматоры. Конечно можно было-бы восстановить и многочлен, для интереса, если-бы значения этих сумматоров не делилось-бы иногда на 256 с отбросом дробной части. А так даже восстановить нереально.
    В качестве начального приближения к косинусу я брал F(t)=1-t^2+t^4.
    Перевёл его в цифру и забыл о нём. А потом улучшал цифру.

    Вот просто для любопытства, если-бы дробные части не отбрасывались, то восстановленный многочлен был-бы:
    1.00297+0.01498*t-1.08493*t^2+0.16189*t^3+0.6596*t^4
    Я глубоко убеждён, что это тебе никак не поможет! Поэтому посчитал на калькуляторе, без проверки о округлил на глазок.

    Кстати, программировал когда нибудь движение точки с постоянным ускорением. Допустим прыжок персонажа? Если да, то вспомни этот момент, и тебе станет понятнее, при чём тут сумматоры и как обойтись без умножения.

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

  8. #77

    Регистрация
    15.01.2005
    Сообщений
    201
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Reobne, навскидку, - может в процедуре поменять местами запись байта и изменение констант (с корректировкой начальных величин, exx вынести вверх), пара байт лишнего jr loop уже и сэкономится, да и структура процедурки покрасивше станет

  9. #78

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,103
    Спасибо Благодарностей отдано 
    1,336
    Спасибо Благодарностей получено 
    323
    Поблагодарили
    152 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    Smile

    Цитата Сообщение от char Посмотреть сообщение
    Reobne, навскидку, - может в процедуре поменять местами запись байта и изменение констант (с корректировкой начальных величин, exx вынести вверх), пара байт лишнего jr loop уже и сэкономится, да и структура процедурки покрасивше станет
    Спасибо! Без одного JR-а размер стал 53 байта!
    Код:
    sintabgen
      ld hl,32737-19
      ld bc,19+5461/256
      ld de,5461+20
      exx
      ld hl,sintab+#40
      ld d,h
      ld e,l
      ld a,-20+2
      EX AF,AF'
    loop
      exx
      ld a,c
      EX AF,AF'
      add a,-2
      ld c,a
      add e
      jr c,$+3
      dec d
      ld e,a
      ld a,c
      EX AF,AF'
      sub d
      jr nc,$+3
      dec b
      ld c,a
      add hl,bc
      ld a,h
      exx
      ld (hl),a
      ld (de),a
      inc e
      dec l
      jr nz,loop
    ;cont
      ld (hl),l
    loop2
      xor a
      sbc a,(hl)
      ld (de),a
      inc l
      inc e
      jr nz,loop2

  10. #79

    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,089
    Спасибо Благодарностей отдано 
    281
    Спасибо Благодарностей получено 
    70
    Поблагодарили
    49 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Reobne Посмотреть сообщение
    Буду чуть позже разбираться, почему оно уходит и нельзя ли это как-то исправить путем манипуляций с коэффициентами или еще как.
    Разобрался, почему уходит решение. При переходе от дифференциальных к разностным уравнениям надо ввести в коэффициенты небольшие поправки. По моим прикидкам, даже 3й порядок - это излишне. Коэффициент при x^3 получается около 1e-7, что меньше 2^-16, да и точность порядка 1e-4 не нужна, достаточно и 2^-8. Попробую рассчитать минимакс-полином 2го порядка.
    Последний раз редактировалось Barmaley_m; 29.11.2013 в 16:48.

  11. #80

    Регистрация
    15.01.2005
    Сообщений
    201
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    абракадабра

    Код:
      ld c,-20+2
    loop
      dec c
      dec c
      ld a,c
      exx
      add e
      jr c,$+3
      dec d
      ld e,a
    ;
      ld a,c
      sub d
      jr nc,$+3
      dec b
      ld c,a
    ;
      add hl,bc

Страница 8 из 16 ПерваяПервая ... 456789101112 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Качение синуса
    от Hacker VBI в разделе Программирование
    Ответов: 38
    Последнее: 08.04.2013, 00:40
  2. Генерация лабиринтов
    от TomCaT в разделе Программирование
    Ответов: 90
    Последнее: 26.06.2012, 10:59
  3. День рождения Синуса!
    от valeron в разделе Поздравления
    Ответов: 9
    Последнее: 19.05.2010, 15:31
  4. Генерация матрицы клавиатуры
    от AlexCrush в разделе Программирование
    Ответов: 5
    Последнее: 23.01.2007, 15:32

Ваши права

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