¿Función arcotangente de la computadora Apollo, atan() o atan2()?

¿Qué tipo de función arcotangente se usó, la de un solo argumento o las famosas atan2(y, x) o arctan2(y, x) con dos argumentos x e y? ¿Qué tipo de aproximación se utilizó?

Respuestas (2)

Dos argumentos, pero no exactamente como atan2 ()

Lo primero que debes entender es que aunque ARCTANse llama en 3 lugares en el código Apolo, en todos los casos se usa para convertir coordenadas rectilíneas (x, y, z) en coordenadas esféricas (r, latitud, longitud).

Describiré como ARCTANse usa en la LAT-LONGsubrutina, en el archivo LATITUDE_ LONGITUDE_ SUBROUTINES.agc , aunque el uso es similar en los demás llamadores. El primer paso es calcular gamma = X 2 + y 2 (líneas 77-82). Luego dividimos x e y cada uno por gamma; x/gamma se almacena en variable global COSTHe y/gamma se almacena en variable global SINTH(líneas 83-87). Entonces estamos listos para llamar a la ARCTANsubrutina (línea 88). Después de que regresa, el resultado se almacena en la variable global LAT(línea 89). Un conjunto similar de cálculos determina la longitud.

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

Como atan2 (), ARCTANtoma dos argumentos. Sin embargo, a diferencia de atan2 (), los argumentos ya deben estar predivididos. En otras palabras, deben estar en el rango de -1 a +1, y sus cuadrados deben sumar 1. Los argumentos se toman de las variables globales COSTHy SINTH. Como sugieren los nombres y debido a la división previa, estos argumentos son el coseno y el seno del ángulo que estamos buscando. La mayor parte de la subrutina verifica el signo +/- de los argumentos, ajustando el resultado para el cuadrante apropiado. El cálculo principal se realiza llamando ASINcon argumento SINTH(línea 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

ASINes una macro para la ARCSINsubrutina en el archivo INTERPRETER.agc . A su vez, se calcula a partir del arcocoseno, usando la relación ARCOS(X) = PI/2 - ARCCOS(X). (Líneas 2704-2705. Sí, aunque ya tenemos el coseno almacenado en COSTH.) ARCCOSse calcula usando la "aproximación de Hastings" y un polinomio de séptimo grado.

El resultado de cada una de las subrutinas trigonométricas inversas son ángulos en el rango de -1/2 a +1/2. Para convertir a radianes, debes multiplicar por π .

Entonces, hay dos argumentos, pero deben dividirse previamente y el resultado debe multiplicarse por π .

¿Podría explicar qué se hace en la línea 214? El caso arctan = 0 para x = 0 y y = 0?
@uwe BZE es una rama cuando es cero, si es cierto, ejecutará ARCTANXX (después de eso, estoy perdido). No estoy seguro de lo que hace RVQ, ¿tal vez el valor de retorno abandone?
@MagicOctopusUrn: RVQ es Retorno a través de QPRET. Vuelve a la ubicación especificada en el registro QPRET. Esta es la forma normal de regresar de una subrutina, aunque si el registro QPRET se ha guardado previamente en una ubicación de memoria, se puede usar GOTO en su lugar. BZE parece usar el valor previamente calculado gamma = sqrt(x^2+y^2) para averiguar si tanto x como y son cero.
@DrSheldon ¿Quieres intentarlo en space.stackexchange.com/q/31196/195 ?
RVQ = retorno a través del registro Q. Los saltos incondicionales almacenan el contador del programa antiguo en el registro Q. Esto permite usar la misma instrucción como una llamada de subrutina. Para volver, simplemente vuelve a la dirección que estaba en el registro Q.
La línea 214 es de hecho un caso especial para x = 0 y y = 0. Verificamos tal condición examinando si gamma termina siendo cero. Se trata como un caso especial que siempre devuelve un ángulo de cero. ¿Cuál es la longitud a +90 grados de latitud? Debería estar indefinido, pero debemos devolver algún número, por lo que devolvemos cero.
@RussellBorogove: ¡He estado trabajando en ello y espero tener una respuesta más tarde hoy!
Pero el valor de arctan2(+0,+0) o arctan(0) está bien definido e igual a +0. atan2(+0, −0) = +π es otra cosa.
@Uwe: atan2 (+0, +0) podría estar bien definido, ¡pero esta no es la función atan2! Piensa en las coordenadas polares planas para x = 0, y = 0. ¿Cuál es el ángulo? Trigonométricamente, no está definido. Pero tienen que hacer que esta subrutina devuelva algún número, por lo que decidieron hacer que este caso devuelva un ángulo de cero.

Aquí puede ver el código fuente de la computadora de orientación del Apolo 11.

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

En el interior, vea Subrutina para ARCTAN.

¿Responde a tu pregunta?

Esa es la única respuesta de un enlace, y solo comprensible para las personas que pueden leer el ensamblaje. La pregunta es qué enfoque matemático se utilizó, no tanto el código fuente.
@Hobbes Existen diferentes lenguajes ensambladores, al menos uno por tipo de procesador. No estoy seguro de qué idioma está usando el código, pero no es uno con el que esté familiarizado, y he estado aquí por un tiempo. No puedo decir qué algoritmo está usando el código.
@DavidThornley ver respuestas a ¿Cómo evaluaron las computadoras Apollo funciones trascendentales como seno, arcotangente, logaritmo? para más información sobre el sabor particular
¡RobinC, bienvenido a Stack Exchange! Es muy diferente a otros sitios que puede haber usado. Puede tener una idea de qué tipo de respuestas son bien recibidas mirando otras respuestas y echando un vistazo a Cómo responder también. El atan2 correcto de cuatro cuadrantes es realmente importante en las aplicaciones de ingeniería y , por lo tanto, ciertamente se implementa de alguna manera . por lo que su respuesta debe ampliar en eso.
En este momento se llama una respuesta de "solo enlace" y esto se desaconseja encarecidamente (y se rechaza) porque los enlaces se rompen y luego la respuesta se vuelve inútil y la pregunta vuelve a quedar sin respuesta. La idea es escribir respuestas que sean útiles para futuros lectores, así como para el OP.
Las líneas 199 a 202 parecen arctan(theta) calculadas a partir de sin(theta) y cos(theta), pero ¿hay una ecuación trigonométrica para eso? ¿Al menos para -0.5 < theta < 0.5?