September 16th, 2021

QuatCore

Формулы приведения, что б их... (и atan на ТРЁХ умножениях)

Формулу арктангенса на 4 умножениях ещё немножко оптимизировал с помощью алгоритма Ремеза:



Ошибка уменьшилась с 4,9 до 4,65 угловой секунды, и дальше уменьшать особо некуда.

Если эти коэффициенты записать в 16 битах, выйдет так:



точность немного упадёт, до 6 угловых секунд:


Учитывая, что это половина цены младшего разряда - вроде всё хорошо.

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

Collapse )

В общем, Буриданов осёл нервно курит в сторонке. Столько разных вариантов, не знаю, что выбрать.

- Есть "старый добрый" алгоритм с поворотами комплексного числа. Тупой до безобразия, но вполне рабочий, и фактически уже реализованный на ассемблере. Он ещё и длину вектора умеет находить! (Т.е либо ему скармливаешь вектор единичной длины - и он находит угол и ещё раз подтверждает единичную длину, либо даёшь вектор произвольный - он его поворачивает практически на нулевой угол, после чего довольно точно даёт длину, но угол "плюс-минус лапоть". Но как ни странно, меня это устраивает) С точностью может быть небольшая засада: за 5 умножений комплексных чисел с хранением результатов в памяти (в 16 битах точности) там накопится некоторая ошибка в младших разрядах.

- Можно atan на 4 умножениях "повернуть" на 45° (заменив y на (|y|-|x|) и x на (|y|+|x|)/2), а знак результата положить равным знаку x·y. Это даст уже 5 умножений, но вроде может получиться весьма компактно и НАИБОЛЕЕ ТОЧНО, поскольку все промежуточные результаты не будут покидать АЛУ, где они хранятся в 32 битах.

- А можно вот этот "компромисс" на 3 умножениях: точность хуже на порядок, но в теории это будет самый быстрый и компактный алгоритм.

Боюсь, в конечном итоге всё равно перепробую все варианты, и только тогда соображу, что мне надо, обычно так бывает. Если вдруг не "припрёт". Сейчас просто затишье: в РКК народ в отпуске до 1 октября, у нас тут тоже никого нет толком. Как вернутся - уже такой фигнёй не займёшься, вернусь к родным бумажкам. Надо ж написать программу ЛОИ (Лабораторно-Отработочных Испытаний), а это не такая программа, что для компьютера, а бумажка такая, нудная до безобразия. Потом ещё будет отчёт по ЛОИ. И, если хватит времени между этими двумя бумажками - может и сам ЛОИ удастся провести...

Poll #2113299 Как мне посчитать арктангенс

Столько вариантов "накопал", а выбрать не могу

На последовательных поворотах комплексного числа
0(0.0%)
На 4 умножениях
2(28.6%)
На 3 умножениях
0(0.0%)
Опробовать все и выбрать наиболее понравившийся
5(71.4%)