September 10th, 2021

Таблица коэффициентов для atan1

Пора уже добить этот несчастный арктангенс, что-то слишком долго его ковыряю. Мы упоминали, что в оперативной памяти будет лежать таблица в 15 слов: 5 углов и 5 комплексных чисел, им соответствующих. Вопрос был, в каком порядке всё это дело расположить, ну и сами константы "придумать". Пожалуй, вот так:

;таблица поворотов для процедуры atan1
AtanTable:
;завершающая итерация
;пока длина вектора составляет 1,0000032 от исходной (в теории, т.е если коэффициенты заданы ровно эти, но вычисления с абсолютной точностью)
Atan4a	Int16 1608		;pi/32 в формате Q2.14
;если cos(pi/32) и sin(pi/32), это было бы 32610 и 3212.
;если cos(1608/16384) и sin(1608/16384), то 32610 и 3211
;но мы ещё должны поделить на 2, т.к формат 2.14, а вектор был в 1.15
;(и это деление проведём, заменив ADD на DIV2A в конце процедуры)
;а ещё умножить на k=1,00120570556/1,0000032
;в итоге возьмём cos(1608/16384)*k и sin(1608/16384)*k
Atan4x	Int16	32650
Atan4y	Int16	3215


;к этому моменту длина вектора составляет 1,000013 от исходной
Atan3a	Int16 3217		;pi/16 в формате Q2.14
Atan3x	Int16 32138		;exp(i*pi/16) = 0,9808 + 0,1951i
Atan3y	Int16 6393

;к этому моменту длина вектора составляет 1,00000107 от исходной (в теории, это sqrt(23170^2+23171^2)/32768)
Atan2a	Int16 6434		;pi/8 в формате Q2.14
Atan2x	Int16 30274		;exp(i*pi/8) = 0,9239 + 0,3827i
Atan2y	Int16 12540

;к этому моменту длина вектора не менялась
Atan1a	Int16 12868		;pi/4, выраженные в формате Q2.14 (в который влезают значения от -4 до 4)
Atan1x	Int16 23170		;exp(i*pi/4) = 0,7071 + 0,7071i
Atan1y	Int16 23171		;а точнее, exp(i * 12868 / 16384), чтобы осуществить именно тот поворот, что указан в Atan1a

Atan0a	Int16 0
Atan0x	Int16 0		;первый поворот, на +- 90 градусов (0+1i)
Atan0y	Int16 -32768	;взяли знак "-" потому что первый раз мы берём обратный знак (из нуля вычитаем "x")
;длина вектора остаётся прежней


Как всегда, здесь всё задом наперёд!
Collapse )

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