А как ты делаешь перспективу? Только не говори, что заменяешь деление умножением. А обратное число берешь из таблицы в несколько килобайт.
Вид для печати
По такой же таблице.
Страничка. Разрядность вроде как 6/+-7.
Страничка - это 16 КБ.
6 бит делимое, 7 бит со знаком делитель.
Результат 7 бит со знаком.
Оптимизировал свою программу вычисления периода косинуса. Удалось выиграть несколько байт кода. Теперь длина равна 54 байтам. Погрешность - такая же, как и у предыдущего варианта.
Привет!
Реализовал синус многочленом.
Вычисляется он на промежутке (0..PI/2), в остальные четверти копируется.
Коэффициенты подобрал методоми "научного тыка" и "искусственного отбора". :)
Получился такой алгоритм:
Тоесть, строго говоря, я считаю косинус, но в итоге получается синус.Код:HL=32737
BC=19
DE=5461
A=-20
FOR X=64 TO 0 STEP -1
SINTAB[X]=H
A=A-2
DE=DE+A
BC=BC-D
HL=HL+BC
NEXT X
Отклонение abs(SINTAB[X]-sin(X*PI/128)*127.5) не превышает 0.503. Это очень близко к идеальному 0.5
И итоговый код:
Это 55 байт кода.Код:sintabgen
ld hl,sintab+#40
ld d,h
ld e,l
exx
ld hl,32737
ld bc,19
ld de,5461
ld a,-20
EX AF,AF'
loop
ld a,h
exx
ld (hl),a
ld (de),a
inc e
dec l
jr z,cont
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
jr loop
cont
ld (hl),l
loop2
xor a
sbc a,(hl)
ld (de),a
inc l
inc e
jr nz,loop2
Понимаю, что не рекорд, но это другой вариант, а значит у него другой потенциал оптимизации.
Писал в эмуляторе EmuZWin. "Генетический алгоритм" на дельфе7.
Если кто захочет другую амплитуду или период - пишите, попробую подобрать коэффициенты. Прогу на дельфе не привожу, не из жадности а от стыда. :)
А будет процедура расчета точки синуса из периода? Быстро, без таблиц :)
Вх. A=X [0..255]
Вых. А=Y (значение синуса)
Амплитуда и период должны меняться на входе в процедуру. Например задаются в HL.