User Tag List

Страница 9 из 16 ПерваяПервая ... 5678910111213 ... ПоследняяПоследняя
Показано с 81 по 90 из 155

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

  1. #81

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

    Smile

    ЗдОрово! Теперь 49 байт!
    Провереный код:
    Код:
    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 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
      ld a,h
      exx
      ld (hl),a
      ld (de),a
      inc e
      dec l
      jr nz,loop
      ld (hl),l
    loop2
      xor a
      sbc a,(hl)
      ld (de),a
      inc l
      inc e
      jr nz,loop2

  2. #82

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

    По умолчанию

    отлично!

    осталось добавить несколько наборов коэффициентов для разных максимальных "ширин синуса" (63, 31, 15...)

  3. #83

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

    По умолчанию

    по сути программы, получился типичный бризенхем / постройка окружности через похожесть графиков квадрата чисел и синусоиды, только с некоторой добавочной корректировкой приращений.
    упрощая вычисления / делая короче, можно вернуться к графику квадрата чисел...
    Последний раз редактировалось char; 29.11.2013 в 16:08.

  4. #84

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

    По умолчанию

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

  5. #85

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

    По умолчанию

    Вот что получилось:
    Код:
    sintabgen2      ;; 45 байт
      ld SP,-64 ;!!!
      ld de,32731-11
      ld bc,11+5639/256
      ld hl,5639+64
      exx
      ld hl,sintab+#40
      ld d,h
      ld e,l
    loop
      exx
      add hl,sp
      ld a,c
      sub h
      jr nc,$+3
      dec b
      ld c,a
      ex de,hl
      add hl,bc
      ex de,hl
      ld a,d
      exx
      ld (hl),a
      ld (de),a
      inc e
      dec l
      jr nz,loop
      ld (hl),l
    loop2
      xor a
      sbc a,(hl)
      ld (de),a
      inc l
      inc e
      jr nz,loop2
    Не так уж сильно и сократилось. Чую есть ещё потенциал упрощения.

  6. #86

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

    По умолчанию

    Рассчитал минимакс-полином второго порядка для косинуса на интервале от 0 до pi/2. Для удобства преобразовал диапазон аргумента из [0..pi/2] в [0..64], чтобы соответствовать таблице длиной в 256 байт. Также вычислял приближение на дискретном множестве точек (целые значения аргумента). Получившаяся формула:

    y = 1.0130681110126272 - 3.1409834002847181e-3*x - 2.0249761634779685e-4*x^2

    Диапазон аргумента - от 0 до 63 (при этом 64 соответствует pi/2). Диапазон значений функции - обычный для косинуса (от 0 до 1). Можно умножить все коэффициенты на 127, чтобы получить значения в диапазоне 8-битного целого со знаком.

    Максимальная абсолютная погрешность данной формулы - 0.0131. Это хуже, чем достижимая для 8-битного целого (0.0039), поэтому лучше будет использовать многочлен 3-го порядка, хоть его точность приближения и избыточна.

  7. #87

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

    По умолчанию

    Выручил указатель стека и ещё немного ужал.
    За счёт замены прибавления 64 на сдвиг #44. И то и другое дают перенос раз в четыре цикла.
    Максимальные отклонения значений в таблице от теории = 0.89.
    Код:
    sintabgen2      ;; 43 байта
      ld de,32731-11
      ld hl,11+5639/256
      ld bc,65536-(5639+64)/256
      exx
      ld hl,sintab+#40
      ld d,h
      ld e,l
      ld c,#44
    loop
      rlc c
      exx
      jr nc,$+3
      inc c
      add hl,bc
      ex de,hl
      add hl,de
      ex de,hl
      ld a,d
      exx
      ld (hl),a
      ld (de),a
      inc e
      dec l
      jr nz,loop
      ld (hl),l
    loop2
      xor a
      sbc a,(hl)
      ld (de),a
      inc l
      inc e
      jr nz,loop2

  8. #88

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

    По умолчанию

    Да, об такой код недолго голову сломать

  9. #89

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

    По умолчанию

    наоборот, все просто

    а то использовать/портить SP - только заради одного стабильного изменения старшего байта на каждые 4 отбавки по 64 - это совсем было не дело
    Последний раз редактировалось char; 29.11.2013 в 21:13.

  10. #90

    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    2,080
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    480
    Поблагодарили
    145 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Красиво.

    от jr можно избавиться так:

    оригинал:
    Код:
      rlc c
      exx
      jr nc,$+3
      inc c

    очень просится ADC HL,BC... но тут всё хитрО

    замена:
    Код:
    	xor a
    	rlc c
    	exx
    	adc a,c
    	ld c,a

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

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

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

Эту тему просматривают: 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

Ваши права

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