Для разнообразия вот еще вам такой синус:
Не самый короткий алгоритм - 53 байта.Код:org $8000 LD B,201 ; Длина таблицы синуса LD HL,$8100 ; Адрес начала таблицы синуса EXX ; XOR A ; LD H,A ; LD L,A ; PUSH HL ; LD IXL,$FE ; JR LoopIn ; ;------------------------------- MLoop: EXX ; SBC HL,BC ; SBC A,IXL ; LD IXL,D ; ;------------------------------- LoopIn: LD D,A ; ADD A,A ; SBC A,A ; LD IXH,A ; LD A,D ; LD E,H ; LD B,3 ; RLoop: SRA D ; RR E ; DJNZ RLoop ; POP BC ; PUSH HL ; SBC HL,DE ; LD D,A ; SBC A,IXH ; ADD HL,HL ; ADC A,A ; EXX ; LD (HL),A ; INC L ; DJNZ MLoop ; POP AF ; RET ;
Да и есть некие ограничения. Длина получаемой таблицы... 201 байт)
Однако, есть и плюсы - высокая точность (теоретически, т.к. это не аппроксимация а чистый синус). В таблице можно сохранять не 8 бит, а все 16 (а то и 24, т.к. в алгоритме 24-битная арифметика).
Так же возможна любая амплитуда.
Можно было бы сделать таблицу 256 байт, но это усложнило бы алгоритм, и он бы стал громоздким.
Изначально думалось, что алгоритм будет компактнее, т.к. я уже привык к 32-битным ARM-ам, где подобный алгоритм получился бы не более, чем за 10 команд.
Кто первый догадается, что за алгоритм - тому конфетка)
Из бейсика вывел полученную таблицу, поделив результат на 2. Вроде все норм.
![]()




Ответить с цитированием