September 2nd, 2021

QuatCore

Мучительно пишем atan1

Думаю, будет правильно данную функцию назвать atan1. А то что такое: обычный atan(x) есть, atan2(y,x) есть, а вот atan1(y,x) куда-то делся :) Вот теперь будет! Напомню, это по сути atan(y/x), вот только мы позволяем x принимать нулевые и околонулевые значения и находим правильный ответ, работая в 16-битной целочисленной арифметике.

Мне казалось, что получился очень простой и компактный алгоритм, который прямо "просится" в QuatCore:

Значения x,y воспринимаем как действительную и мнимую части числа V = x + iy
Ответ A (от слова Angle, угол) инициализируем нулём
Для n=1 .. 5
    смотрим знак x
    домножаем V на exp(±i*pi/2n)
    если n>1, то A = A ± pi/2n
    (вместо ± подставляется знак числа x) 

A = A + 1,0012x. 



Значений экспоненты нужно всего 5, их можно посчитать заранее и поместить в память. Избавиться от условия внутри цикла также можно, если числа 0, pi/2, pi/4, ... , pi/32 также поместить в таблицу. Аж целых 5 слов на это дело истратим, зато "единообразно".

А ещё в последний элемент таблицы можно включить константу 1,0012, т.е не просто поворот, но и масштабирование, чтоб задействовать возможности комплексных чисел "на максимум". В итоге и в последней строке не нужен множитель, просто прибавляем x.

Но "суровая действительность", как всегда, вносит свои коррективы...

Collapse )

Без сохранения значений регистров в стеке, получается 22 строки кода, или 44 байта :) С сохранениями - 30 строк, или 60 байт. И ещё 15 слов (30 байт) будут зарезервированы в оперативной памяти, для таблицы углов.

Вот только чтобы эту программу можно было откомпилировать и запустить, нужно добавить ещё одну команду в АЛУ, "S", и навести наконец-то порядок со знаками для FMPM! Этим сейчас и займёмся.