martes, 3 de febrero de 2015

Función Arco Coseno para VBasic

O como complicarse la vida inútilmente, con lo sencillo que resulta. 
Necesito obtener el arco coseno de un valor para procesarlo en VBasic para excel. VBasic no tiene una que lo permita, tampoco tiene la función arco seno, solo tiene arco tangente.
Tiro de mi casi del todo olvidada base matemática y decido generar una función arco coseno (MiACos(R)) en base al desarrollo en serie de dicha función. Encuentro en internet dos desarrollos, uno de los cuales directamente no entiendo, y con el otro empiezo el desarrollo (no pongo la fórmula de la serie.) Funcionar, funciona, pero solo para ángulos con un valor superior a 15 grados. Para valores inferiores, si intento apurar el número de términos sumados se produce un desbordamiento y no puedo aumentar la resolución.
Estuve dos días dedicado a simplificar las respectivas multiplicaciones y llego a la siguiente función:


Function MiACos4(R)

Dim Pi, DosNMas1, FactN, Fact2N, X, M, CuatroN
Pi = 3.141592654
M = Pi / 2
For N = 0 To 2506
DosNMas1 = 2 * N + 1
F = 1 / (DosNMas1)
For I = 1 To N
X = (N + I) / I
F = F * X / 4
Next


M = M - F * (R ^ DosNMas1) '



Next



MiACos4 = M


End Function


No la explico, funciona entre 5 y 90 º, pero la desecho. No lleva a ningún sitio.



Pienso y me digo, VBasic tiene la función Atn(r), arco tangente en radianes. Y si conozco el coseno, conozco el seno  (sen^2+cos^2=1) y si conozco seno y coseno conozco la tangente. A partir de este supuesto creo la siguiente función, sin complicarme la vida:



Function MiACos5(R)

Dim S, C, T
C = R
S = Sqr((1 - R ^ 2))
T = S / C


MiACos5 = Atn(T)


End Function


Como podéis ver no he contemplado la posible división por cero, lo dejo en manos de quien quiera utilizarla.