Аркутангенсная функция компьютера Аполлон, atan() или atan2()?

Какой тип функции арккасангенс использовался, функция только с одним аргументом или знаменитая функция atan2(y, x) или arctan2(y, x) с двумя аргументами x и y? Какая аппроксимация использовалась?

Ответы (2)

Два аргумента, но не совсем как atan2 ()

Первое, что вы должны понять, это то, что хотя ARCTANон вызывается в 3-х местах в коде Аполлона, в каждом случае он используется для преобразования прямолинейных координат (x, y, z) в сферические координаты (r, широта, долгота).

Я опишу, как ARCTANиспользуется в LAT-LONGподпрограмме, в файле LATITUDE_LONGITUDE_SUBROUTINES.agc , хотя использование аналогично в других вызывающих программах. Первым шагом является вычисление гаммы = Икс 2 + у 2 (строки 77-82). Затем мы делим x и y на гамму; x/gamma хранится в глобальной переменной COSTH, а y/gamma хранится в глобальной переменной SINTH(строки 83-87). Теперь мы готовы вызвать ARCTANподпрограмму (строка 88). После возврата результат сохраняется в глобальной переменной LAT(строка 89). Аналогичный набор вычислений определяет долготу.

77:     DLOAD   DSQ
78:     ALPHAV
79:     PDDL    DSQ
80:     ALPHAV +2
81:# Page 1237
82:     DAD SQRT
83:     DMP SL1R
84:     GAMRP
85:     STODL   COSTH       # COS(LAT) B-1
86:     ALPHAV +4
87:     STCALL  SINTH       # SIN(LAT) B-1
88:     ARCTAN
89:     STODL   LAT     # LAT B0

Как и atan2 (), ARCTANпринимает два аргумента. Однако, в отличие от atan2 (), аргументы уже должны быть предварительно разделены. Другими словами, они должны быть в диапазоне от -1 до +1, а сумма их квадратов должна равняться 1. Аргументы берутся из глобальных переменных COSTHи SINTH. Как следует из названий и из-за предварительного деления, эти аргументы являются косинусом и синусом угла, который мы ищем. Основная часть подпрограммы проверяет знак +/- аргументов, корректируя результат для соответствующего квадранта. Основной расчет выполняется вызовом ASINс аргументом SINTH(строка 219).

196:        # Page 1240
197:        # ARCTAN SUBROUTINE
198:        #
199:        # CALLING SEQUENCE
200:        #   SIN THETA IN SINTH B-1
201:        #   COS THETA IN COSTH B-1
202:        #   CALL ARCTAN
203:        #
204:        # OUTPUT
205:        #   ARCTAN THETA IN MPAC AND THETA B-0 IN RANGE -1/2 TO +1/2
206:        
207:        ARCTAN      BOV
208:                    CLROVFLW
209:        CLROVFLW    DLOAD   DSQ
210:                    SINTH
211:                PDDL    DSQ
212:                    COSTH
213:                DAD
214:                BZE SQRT
215:                    ARCTANXX    # ATAN=0/0.  SET THETA=0
216:                BDDV    BOV
217:                    SINTH
218:                    ATAN=90
219:                SR1 ASIN
220:                STORE   THETA
221:                PDDL    BMN
222:                    COSTH
223:                    NEGCOS
224:                DLOAD   RVQ
225:        NEGCOS      DLOAD   DCOMP
226:                BPL DAD
227:                    NEGOUT
228:                    DP1/2
229:        ARCTANXX    STORE   THETA
230:                RVQ
231:        
232:        NEGOUT      DSU GOTO
233:                    DP1/2
234:                    ARCTANXX
235:        ATAN=90     DLOAD   SIGN
236:                    LODP1/4
237:                    SINTH
238:                STORE   THETA
239:                RVQ

ASINэто макрос для ARCSINподпрограммы в файле INTERPRETER.agc . В свою очередь, он вычисляется из арккосинуса с использованием соотношения ARCSIN(X) = PI/2 - ARCCOS(X). (Строки 2704-2705. Да, хотя у нас уже есть косинус, хранящийся в COSTH.) ARCCOSвычисляется с использованием «приближения Гастингса» и полинома 7-й степени.

Результатом каждой из подпрограмм обратного триггера являются углы в диапазоне от -1/2 до +1/2. Чтобы перевести в радианы, нужно умножить на π .

Итак, аргументов два, но их надо предварительно разделить, а результат умножить на π .

Не могли бы вы объяснить, что делается в строке 214? Случай arctan = 0 для x = 0 и y = 0?
@uwe BZE - это ветвь, когда ноль, если это правда, она запустит ARCTANXX (после этого я потеряюсь). Не уверен, что делает RVQ, может быть, возвращаемое значение уходит?
@MagicOctopusUrn: RVQ возвращается через QPRET. Возврат к месту, указанному в регистре QPRET. Это обычный способ возврата из подпрограммы, хотя, если регистр QPRET ранее был сохранен в ячейке памяти, вместо него можно использовать GOTO. BZE, похоже, использует ранее вычисленное значение gamma = sqrt(x^2+y^2), чтобы узнать, равны ли x и y нулю.
@DrSheldon Хотите нанести удар по адресу space.stackexchange.com/q/31196/195 ?
RVQ = возврат через регистр Q. Безусловные переходы сохраняют старый программный счетчик в регистре Q. Это позволяет использовать ту же инструкцию в качестве вызова подпрограммы. Чтобы вернуться, вы просто возвращаетесь к адресу, который был в регистре Q.
Строка 214 действительно является особым случаем для x = 0 и y = 0. Мы проверяем это условие, проверяя, не оказывается ли гамма нулевой. Это рассматривается как особый случай, который всегда возвращает нулевой угол. Какова долгота на +90 градусах широты? Оно должно быть неопределенным, но мы должны вернуть какое-то число, поэтому мы возвращаем ноль.
@RussellBorogove: я работал над этим и надеюсь получить ответ сегодня позже!
Но значение arctan2(+0,+0) или arctan(0) хорошо определено и равно +0. atan2(+0, −0) = +π — это другое.
@Uwe: atan2(+0, +0) может быть хорошо определен, но это не функция atan2! Подумайте о плоских полярных координатах для x = 0, y = 0. Что такое угол? Тригонометрически он не определен. Но они должны заставить эту подпрограмму возвращать какое-то число, поэтому они решили заставить этот случай возвращать нулевой угол.

Здесь вы можете увидеть исходный код компьютера управления Apollo 11.

https://github.com/chrislgarry/Apollo-11/blob/27e2acf88a6345e2b1064c8b006a154363937050/Comanche055/LATITUDE_LONGITUDE_SUBROUTINES.agc

Внутри см. Подпрограмму для ARCTAN.

Отвечает на ваш вопрос?

Это единственный ответ по ссылке, и он понятен только людям, умеющим читать ассемблер. Вопрос спрашивает, какой математический подход был использован, а не столько исходный код.
@Hobbes Существуют разные языки ассемблера, по крайней мере, по одному для каждого типа процессора. Я не уверен, какой язык используется в коде, но я не знаком с ним, а работаю с ним уже некоторое время. Я не могу сказать, какой алгоритм использует код.
@DavidThornley см. ответы на Как компьютеры Apollo оценивали трансцендентные функции, такие как синус, арктангенс, логарифм? для получения дополнительной информации о конкретном аромате
RobinC добро пожаловать на Stack Exchange! Это сильно отличается от других сайтов, которые вы, возможно, использовали. Вы можете почувствовать, какие ответы хорошо принимаются, просмотрев другие ответы, а также взглянув на «Как отвечать» . Четырехквадрантный правильный atan2 действительно важен в инженерных приложениях, и поэтому он, безусловно, каким -то образом реализуется . так что ваш ответ должен расширить это.
Прямо сейчас это называется ответом «только для ссылок», и это настоятельно не рекомендуется (и за него проголосовали), потому что ссылки ломаются, а затем ответ становится бесполезным, и вопрос снова остается без ответа. Идея состоит в том, чтобы написать ответы, которые будут полезны будущим читателям, а также ОП.
Строки с 199 по 202 выглядят так, будто арктан(тета) вычисляется из sin(тета) и cos(тета), но существует ли для этого тригонометрическое уравнение? По крайней мере, для -0,5 < тета < 0,5?