# TRITIUM-PROVENANCE sha256=7d39c62b82a8fe24db8bfa1ad15f8cfe9b8cb789401717ec26e061c79bba383b lang=python # TRITIUM-HEIGHT high=0.22 mid=0.59 low=0.19 fns=8 # TRITIUM-PSEUDO fn=fsin #| fn fsin(x): #| return a * (1.0 + x2 * (-0.16666666666666666 + x2 * (0.008333333333333333 + x2 * (-0.0001984126984126984 + x2 * 2.7557319223985893e-06)))) # TRITIUM-HEIGHT fn=fsin high=0.00 mid=0.44 low=0.56 role=algo_mid def fsin(x: float) -> float: pi = 3.141592653589793 two = 6.283185307179586 a = x while a > pi: a = a - two while a <= -pi: a = a + two x2 = a * a return a * (1.0 + x2 * (-0.16666666666666666 + x2 * (0.008333333333333333 + x2 * (-0.0001984126984126984 + x2 * 2.7557319223985893e-06)))) # TRITIUM-PSEUDO fn=fcos #| fn fcos(x): #| return 1.0 + x2 * (-0.5 + x2 * (0.041666666666666664 + x2 * (-0.001388888888888889 + x2 * 2.48015873015873e-05))) # TRITIUM-HEIGHT fn=fcos high=0.00 mid=0.44 low=0.56 role=algo_mid def fcos(x: float) -> float: pi = 3.141592653589793 two = 6.283185307179586 a = x while a > pi: a = a - two while a <= -pi: a = a + two x2 = a * a return 1.0 + x2 * (-0.5 + x2 * (0.041666666666666664 + x2 * (-0.001388888888888889 + x2 * 2.48015873015873e-05))) # TRITIUM-PSEUDO fn=fsqrt #| fn fsqrt(x): #| return g # TRITIUM-HEIGHT fn=fsqrt high=0.00 mid=0.63 low=0.37 role=algo_mid def fsqrt(x: float) -> float: if x <= 0.0: return 0.0 g = x i = 0 while i < 8: g = 0.5 * (g + x / g) i = i + 1 return g # TRITIUM-PSEUDO fn=haversine_f #| fn haversine_f(lat1, lon1, lat2, lon2): #| fsin(...) #| fsqrt(...) #| fcos(...) #| return 2.0 * fsqrt(h) # TRITIUM-HEIGHT fn=haversine_f high=0.75 mid=0.25 low=0.00 def haversine_f(lat1: float, lon1: float, lat2: float, lon2: float) -> float: dlat = lat2 - lat1 dlon = lon2 - lon1 aa = fsin(dlat / 2.0) bb = fsin(dlon / 2.0) h = aa * aa + fcos(lat1) * fcos(lat2) * bb * bb return 2.0 * fsqrt(h) # TRITIUM-PSEUDO fn=_atan_unit #| fn _atan_unit(a): #| return r # TRITIUM-HEIGHT fn=_atan_unit high=0.00 mid=1.00 low=0.00 role=algo_mid def _atan_unit(a: float) -> float: t8 = 0.41421356237309503 folded = 0 t = a if t > t8: t = (1.0 - t) / (1.0 + t) folded = 1 z2 = t * t r = t * (1.0 + z2 * (-0.3333333333333333 + z2 * (0.2 + z2 * (-0.14285714285714285 + z2 * (0.1111111111111111 + z2 * -0.09090909090909091))))) if folded == 1: r = 0.7853981633974483 - r return r # TRITIUM-PSEUDO fn=fatan_poly #| fn fatan_poly(z): #| _atan_unit(...) #| return r # TRITIUM-HEIGHT fn=fatan_poly high=0.13 mid=0.87 low=0.00 def fatan_poly(z: float) -> float: neg = 0 a = z if a < 0.0: a = 0.0 - a neg = 1 swapped = 0 if a > 1.0: a = 1.0 / a swapped = 1 r = _atan_unit(a) if swapped == 1: r = 1.5707963267948966 - r if neg == 1: r = 0.0 - r return r # TRITIUM-PSEUDO fn=fatan2 #| fn fatan2(y, x): #| fatan_poly(...) # TRITIUM-HEIGHT fn=fatan2 high=0.19 mid=0.81 low=0.00 role=algo_mid def fatan2(y: float, x: float) -> float: ay = y if ay < 0.0: ay = 0.0 - ay ax = x if ax < 0.0: ax = 0.0 - ax if ax >= ay: if ax == 0.0: return 0.0 a = fatan_poly(ay / ax) else: if ay == 0.0: return 0.0 a = 1.5707963267948966 - fatan_poly(ax / ay) if x < 0.0: if y < 0.0: return a - 3.141592653589793 return 3.141592653589793 - a else: if y < 0.0: return 0.0 - a return a # TRITIUM-PSEUDO fn=bearing_f #| fn bearing_f(lat1, lon1, lat2, lon2): #| fsin(...) #| fcos(...) #| fatan2(...) #| return br # TRITIUM-HEIGHT fn=bearing_f high=0.69 mid=0.31 low=0.00 def bearing_f(lat1: float, lon1: float, lat2: float, lon2: float) -> float: dlon = lon2 - lon1 sd = fsin(dlon) cl2 = fcos(lat2) y = sd * cl2 cl1 = fcos(lat1) sl2 = fsin(lat2) sl1 = fsin(lat1) cl2b = fcos(lat2) cd = fcos(dlon) x = cl1 * sl2 - sl1 * cl2b * cd br = fatan2(y, x) return br