
(FPCore (lambda1 lambda2 phi1 phi2) :precision binary64 (+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ (cos phi1) (* (cos phi2) (cos (- lambda1 lambda2)))))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos(phi1) + (cos(phi2) * cos((lambda1 - lambda2)))));
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
code = lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos(phi1) + (cos(phi2) * cos((lambda1 - lambda2)))))
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + Math.atan2((Math.cos(phi2) * Math.sin((lambda1 - lambda2))), (Math.cos(phi1) + (Math.cos(phi2) * Math.cos((lambda1 - lambda2)))));
}
def code(lambda1, lambda2, phi1, phi2): return lambda1 + math.atan2((math.cos(phi2) * math.sin((lambda1 - lambda2))), (math.cos(phi1) + (math.cos(phi2) * math.cos((lambda1 - lambda2)))))
function code(lambda1, lambda2, phi1, phi2) return Float64(lambda1 + atan(Float64(cos(phi2) * sin(Float64(lambda1 - lambda2))), Float64(cos(phi1) + Float64(cos(phi2) * cos(Float64(lambda1 - lambda2)))))) end
function tmp = code(lambda1, lambda2, phi1, phi2) tmp = lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos(phi1) + (cos(phi2) * cos((lambda1 - lambda2))))); end
code[lambda1_, lambda2_, phi1_, phi2_] := N[(lambda1 + N[ArcTan[N[(N[Cos[phi2], $MachinePrecision] * N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] / N[(N[Cos[phi1], $MachinePrecision] + N[(N[Cos[phi2], $MachinePrecision] * N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{\cos \phi_1 + \cos \phi_2 \cdot \cos \left(\lambda_1 - \lambda_2\right)}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 15 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (lambda1 lambda2 phi1 phi2) :precision binary64 (+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ (cos phi1) (* (cos phi2) (cos (- lambda1 lambda2)))))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos(phi1) + (cos(phi2) * cos((lambda1 - lambda2)))));
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
code = lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos(phi1) + (cos(phi2) * cos((lambda1 - lambda2)))))
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + Math.atan2((Math.cos(phi2) * Math.sin((lambda1 - lambda2))), (Math.cos(phi1) + (Math.cos(phi2) * Math.cos((lambda1 - lambda2)))));
}
def code(lambda1, lambda2, phi1, phi2): return lambda1 + math.atan2((math.cos(phi2) * math.sin((lambda1 - lambda2))), (math.cos(phi1) + (math.cos(phi2) * math.cos((lambda1 - lambda2)))))
function code(lambda1, lambda2, phi1, phi2) return Float64(lambda1 + atan(Float64(cos(phi2) * sin(Float64(lambda1 - lambda2))), Float64(cos(phi1) + Float64(cos(phi2) * cos(Float64(lambda1 - lambda2)))))) end
function tmp = code(lambda1, lambda2, phi1, phi2) tmp = lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos(phi1) + (cos(phi2) * cos((lambda1 - lambda2))))); end
code[lambda1_, lambda2_, phi1_, phi2_] := N[(lambda1 + N[ArcTan[N[(N[Cos[phi2], $MachinePrecision] * N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] / N[(N[Cos[phi1], $MachinePrecision] + N[(N[Cos[phi2], $MachinePrecision] * N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{\cos \phi_1 + \cos \phi_2 \cdot \cos \left(\lambda_1 - \lambda_2\right)}
\end{array}
(FPCore (lambda1 lambda2 phi1 phi2) :precision binary64 (+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (fma (cos phi2) (cos (- lambda1 lambda2)) (cos phi1)))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), fma(cos(phi2), cos((lambda1 - lambda2)), cos(phi1)));
}
function code(lambda1, lambda2, phi1, phi2) return Float64(lambda1 + atan(Float64(cos(phi2) * sin(Float64(lambda1 - lambda2))), fma(cos(phi2), cos(Float64(lambda1 - lambda2)), cos(phi1)))) end
code[lambda1_, lambda2_, phi1_, phi2_] := N[(lambda1 + N[ArcTan[N[(N[Cos[phi2], $MachinePrecision] * N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] / N[(N[Cos[phi2], $MachinePrecision] * N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision] + N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{\mathsf{fma}\left(\cos \phi_2, \cos \left(\lambda_1 - \lambda_2\right), \cos \phi_1\right)}
\end{array}
Initial program 99.7%
+-commutative99.7%
fma-define99.7%
Simplified99.7%
(FPCore (lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (cos (- lambda1 lambda2))))
(if (<= (cos phi2) 0.995)
(+
lambda1
(atan2 (* (cos phi2) (sin (- lambda2))) (+ (* (cos phi2) t_0) 1.0)))
(+
lambda1
(atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ t_0 (cos phi1)))))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = cos((lambda1 - lambda2));
double tmp;
if (cos(phi2) <= 0.995) {
tmp = lambda1 + atan2((cos(phi2) * sin(-lambda2)), ((cos(phi2) * t_0) + 1.0));
} else {
tmp = lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (t_0 + cos(phi1)));
}
return tmp;
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
real(8) :: t_0
real(8) :: tmp
t_0 = cos((lambda1 - lambda2))
if (cos(phi2) <= 0.995d0) then
tmp = lambda1 + atan2((cos(phi2) * sin(-lambda2)), ((cos(phi2) * t_0) + 1.0d0))
else
tmp = lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (t_0 + cos(phi1)))
end if
code = tmp
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = Math.cos((lambda1 - lambda2));
double tmp;
if (Math.cos(phi2) <= 0.995) {
tmp = lambda1 + Math.atan2((Math.cos(phi2) * Math.sin(-lambda2)), ((Math.cos(phi2) * t_0) + 1.0));
} else {
tmp = lambda1 + Math.atan2((Math.cos(phi2) * Math.sin((lambda1 - lambda2))), (t_0 + Math.cos(phi1)));
}
return tmp;
}
def code(lambda1, lambda2, phi1, phi2): t_0 = math.cos((lambda1 - lambda2)) tmp = 0 if math.cos(phi2) <= 0.995: tmp = lambda1 + math.atan2((math.cos(phi2) * math.sin(-lambda2)), ((math.cos(phi2) * t_0) + 1.0)) else: tmp = lambda1 + math.atan2((math.cos(phi2) * math.sin((lambda1 - lambda2))), (t_0 + math.cos(phi1))) return tmp
function code(lambda1, lambda2, phi1, phi2) t_0 = cos(Float64(lambda1 - lambda2)) tmp = 0.0 if (cos(phi2) <= 0.995) tmp = Float64(lambda1 + atan(Float64(cos(phi2) * sin(Float64(-lambda2))), Float64(Float64(cos(phi2) * t_0) + 1.0))); else tmp = Float64(lambda1 + atan(Float64(cos(phi2) * sin(Float64(lambda1 - lambda2))), Float64(t_0 + cos(phi1)))); end return tmp end
function tmp_2 = code(lambda1, lambda2, phi1, phi2) t_0 = cos((lambda1 - lambda2)); tmp = 0.0; if (cos(phi2) <= 0.995) tmp = lambda1 + atan2((cos(phi2) * sin(-lambda2)), ((cos(phi2) * t_0) + 1.0)); else tmp = lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (t_0 + cos(phi1))); end tmp_2 = tmp; end
code[lambda1_, lambda2_, phi1_, phi2_] := Block[{t$95$0 = N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]}, If[LessEqual[N[Cos[phi2], $MachinePrecision], 0.995], N[(lambda1 + N[ArcTan[N[(N[Cos[phi2], $MachinePrecision] * N[Sin[(-lambda2)], $MachinePrecision]), $MachinePrecision] / N[(N[(N[Cos[phi2], $MachinePrecision] * t$95$0), $MachinePrecision] + 1.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(lambda1 + N[ArcTan[N[(N[Cos[phi2], $MachinePrecision] * N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] / N[(t$95$0 + N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \cos \left(\lambda_1 - \lambda_2\right)\\
\mathbf{if}\;\cos \phi_2 \leq 0.995:\\
\;\;\;\;\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(-\lambda_2\right)}{\cos \phi_2 \cdot t\_0 + 1}\\
\mathbf{else}:\\
\;\;\;\;\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{t\_0 + \cos \phi_1}\\
\end{array}
\end{array}
if (cos.f64 phi2) < 0.994999999999999996Initial program 99.6%
Taylor expanded in lambda2 around inf 82.5%
Taylor expanded in phi1 around 0 64.1%
Taylor expanded in lambda2 around inf 74.0%
neg-mul-174.0%
Simplified74.0%
if 0.994999999999999996 < (cos.f64 phi2) Initial program 99.8%
Taylor expanded in phi2 around 0 98.4%
Final simplification85.6%
(FPCore (lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (cos (- lambda1 lambda2))))
(if (<= (cos phi2) 0.7)
(+
lambda1
(atan2 (* (cos phi2) (sin lambda1)) (+ (* (cos phi2) t_0) 1.0)))
(+ lambda1 (atan2 (sin (- lambda1 lambda2)) (+ t_0 (cos phi1)))))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = cos((lambda1 - lambda2));
double tmp;
if (cos(phi2) <= 0.7) {
tmp = lambda1 + atan2((cos(phi2) * sin(lambda1)), ((cos(phi2) * t_0) + 1.0));
} else {
tmp = lambda1 + atan2(sin((lambda1 - lambda2)), (t_0 + cos(phi1)));
}
return tmp;
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
real(8) :: t_0
real(8) :: tmp
t_0 = cos((lambda1 - lambda2))
if (cos(phi2) <= 0.7d0) then
tmp = lambda1 + atan2((cos(phi2) * sin(lambda1)), ((cos(phi2) * t_0) + 1.0d0))
else
tmp = lambda1 + atan2(sin((lambda1 - lambda2)), (t_0 + cos(phi1)))
end if
code = tmp
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = Math.cos((lambda1 - lambda2));
double tmp;
if (Math.cos(phi2) <= 0.7) {
tmp = lambda1 + Math.atan2((Math.cos(phi2) * Math.sin(lambda1)), ((Math.cos(phi2) * t_0) + 1.0));
} else {
tmp = lambda1 + Math.atan2(Math.sin((lambda1 - lambda2)), (t_0 + Math.cos(phi1)));
}
return tmp;
}
def code(lambda1, lambda2, phi1, phi2): t_0 = math.cos((lambda1 - lambda2)) tmp = 0 if math.cos(phi2) <= 0.7: tmp = lambda1 + math.atan2((math.cos(phi2) * math.sin(lambda1)), ((math.cos(phi2) * t_0) + 1.0)) else: tmp = lambda1 + math.atan2(math.sin((lambda1 - lambda2)), (t_0 + math.cos(phi1))) return tmp
function code(lambda1, lambda2, phi1, phi2) t_0 = cos(Float64(lambda1 - lambda2)) tmp = 0.0 if (cos(phi2) <= 0.7) tmp = Float64(lambda1 + atan(Float64(cos(phi2) * sin(lambda1)), Float64(Float64(cos(phi2) * t_0) + 1.0))); else tmp = Float64(lambda1 + atan(sin(Float64(lambda1 - lambda2)), Float64(t_0 + cos(phi1)))); end return tmp end
function tmp_2 = code(lambda1, lambda2, phi1, phi2) t_0 = cos((lambda1 - lambda2)); tmp = 0.0; if (cos(phi2) <= 0.7) tmp = lambda1 + atan2((cos(phi2) * sin(lambda1)), ((cos(phi2) * t_0) + 1.0)); else tmp = lambda1 + atan2(sin((lambda1 - lambda2)), (t_0 + cos(phi1))); end tmp_2 = tmp; end
code[lambda1_, lambda2_, phi1_, phi2_] := Block[{t$95$0 = N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]}, If[LessEqual[N[Cos[phi2], $MachinePrecision], 0.7], N[(lambda1 + N[ArcTan[N[(N[Cos[phi2], $MachinePrecision] * N[Sin[lambda1], $MachinePrecision]), $MachinePrecision] / N[(N[(N[Cos[phi2], $MachinePrecision] * t$95$0), $MachinePrecision] + 1.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(lambda1 + N[ArcTan[N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision] / N[(t$95$0 + N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \cos \left(\lambda_1 - \lambda_2\right)\\
\mathbf{if}\;\cos \phi_2 \leq 0.7:\\
\;\;\;\;\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \lambda_1}{\cos \phi_2 \cdot t\_0 + 1}\\
\mathbf{else}:\\
\;\;\;\;\lambda_1 + \tan^{-1}_* \frac{\sin \left(\lambda_1 - \lambda_2\right)}{t\_0 + \cos \phi_1}\\
\end{array}
\end{array}
if (cos.f64 phi2) < 0.69999999999999996Initial program 99.6%
Taylor expanded in lambda2 around inf 80.2%
Taylor expanded in phi1 around 0 61.6%
Taylor expanded in lambda2 around 0 58.5%
if 0.69999999999999996 < (cos.f64 phi2) Initial program 99.8%
Taylor expanded in phi2 around 0 88.8%
Taylor expanded in phi2 around 0 88.8%
Final simplification76.6%
(FPCore (lambda1 lambda2 phi1 phi2) :precision binary64 (+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ (cos phi1) (* (cos phi2) (cos (- lambda1 lambda2)))))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos(phi1) + (cos(phi2) * cos((lambda1 - lambda2)))));
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
code = lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos(phi1) + (cos(phi2) * cos((lambda1 - lambda2)))))
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + Math.atan2((Math.cos(phi2) * Math.sin((lambda1 - lambda2))), (Math.cos(phi1) + (Math.cos(phi2) * Math.cos((lambda1 - lambda2)))));
}
def code(lambda1, lambda2, phi1, phi2): return lambda1 + math.atan2((math.cos(phi2) * math.sin((lambda1 - lambda2))), (math.cos(phi1) + (math.cos(phi2) * math.cos((lambda1 - lambda2)))))
function code(lambda1, lambda2, phi1, phi2) return Float64(lambda1 + atan(Float64(cos(phi2) * sin(Float64(lambda1 - lambda2))), Float64(cos(phi1) + Float64(cos(phi2) * cos(Float64(lambda1 - lambda2)))))) end
function tmp = code(lambda1, lambda2, phi1, phi2) tmp = lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos(phi1) + (cos(phi2) * cos((lambda1 - lambda2))))); end
code[lambda1_, lambda2_, phi1_, phi2_] := N[(lambda1 + N[ArcTan[N[(N[Cos[phi2], $MachinePrecision] * N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] / N[(N[Cos[phi1], $MachinePrecision] + N[(N[Cos[phi2], $MachinePrecision] * N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{\cos \phi_1 + \cos \phi_2 \cdot \cos \left(\lambda_1 - \lambda_2\right)}
\end{array}
Initial program 99.7%
(FPCore (lambda1 lambda2 phi1 phi2) :precision binary64 (+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ (cos phi1) (* (cos phi2) (cos lambda2))))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos(phi1) + (cos(phi2) * cos(lambda2))));
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
code = lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos(phi1) + (cos(phi2) * cos(lambda2))))
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + Math.atan2((Math.cos(phi2) * Math.sin((lambda1 - lambda2))), (Math.cos(phi1) + (Math.cos(phi2) * Math.cos(lambda2))));
}
def code(lambda1, lambda2, phi1, phi2): return lambda1 + math.atan2((math.cos(phi2) * math.sin((lambda1 - lambda2))), (math.cos(phi1) + (math.cos(phi2) * math.cos(lambda2))))
function code(lambda1, lambda2, phi1, phi2) return Float64(lambda1 + atan(Float64(cos(phi2) * sin(Float64(lambda1 - lambda2))), Float64(cos(phi1) + Float64(cos(phi2) * cos(lambda2))))) end
function tmp = code(lambda1, lambda2, phi1, phi2) tmp = lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos(phi1) + (cos(phi2) * cos(lambda2)))); end
code[lambda1_, lambda2_, phi1_, phi2_] := N[(lambda1 + N[ArcTan[N[(N[Cos[phi2], $MachinePrecision] * N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] / N[(N[Cos[phi1], $MachinePrecision] + N[(N[Cos[phi2], $MachinePrecision] * N[Cos[lambda2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{\cos \phi_1 + \cos \phi_2 \cdot \cos \lambda_2}
\end{array}
Initial program 99.7%
Taylor expanded in lambda1 around 0 98.9%
+-commutative98.9%
cos-neg98.9%
Simplified98.9%
Final simplification98.9%
(FPCore (lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (cos (- lambda1 lambda2)))
(t_1 (* (cos phi2) (sin (- lambda1 lambda2)))))
(if (<= phi1 3.1e-7)
(+ lambda1 (atan2 t_1 (+ (* (cos phi2) t_0) 1.0)))
(+ lambda1 (atan2 t_1 (+ t_0 (cos phi1)))))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = cos((lambda1 - lambda2));
double t_1 = cos(phi2) * sin((lambda1 - lambda2));
double tmp;
if (phi1 <= 3.1e-7) {
tmp = lambda1 + atan2(t_1, ((cos(phi2) * t_0) + 1.0));
} else {
tmp = lambda1 + atan2(t_1, (t_0 + cos(phi1)));
}
return tmp;
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
real(8) :: t_0
real(8) :: t_1
real(8) :: tmp
t_0 = cos((lambda1 - lambda2))
t_1 = cos(phi2) * sin((lambda1 - lambda2))
if (phi1 <= 3.1d-7) then
tmp = lambda1 + atan2(t_1, ((cos(phi2) * t_0) + 1.0d0))
else
tmp = lambda1 + atan2(t_1, (t_0 + cos(phi1)))
end if
code = tmp
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = Math.cos((lambda1 - lambda2));
double t_1 = Math.cos(phi2) * Math.sin((lambda1 - lambda2));
double tmp;
if (phi1 <= 3.1e-7) {
tmp = lambda1 + Math.atan2(t_1, ((Math.cos(phi2) * t_0) + 1.0));
} else {
tmp = lambda1 + Math.atan2(t_1, (t_0 + Math.cos(phi1)));
}
return tmp;
}
def code(lambda1, lambda2, phi1, phi2): t_0 = math.cos((lambda1 - lambda2)) t_1 = math.cos(phi2) * math.sin((lambda1 - lambda2)) tmp = 0 if phi1 <= 3.1e-7: tmp = lambda1 + math.atan2(t_1, ((math.cos(phi2) * t_0) + 1.0)) else: tmp = lambda1 + math.atan2(t_1, (t_0 + math.cos(phi1))) return tmp
function code(lambda1, lambda2, phi1, phi2) t_0 = cos(Float64(lambda1 - lambda2)) t_1 = Float64(cos(phi2) * sin(Float64(lambda1 - lambda2))) tmp = 0.0 if (phi1 <= 3.1e-7) tmp = Float64(lambda1 + atan(t_1, Float64(Float64(cos(phi2) * t_0) + 1.0))); else tmp = Float64(lambda1 + atan(t_1, Float64(t_0 + cos(phi1)))); end return tmp end
function tmp_2 = code(lambda1, lambda2, phi1, phi2) t_0 = cos((lambda1 - lambda2)); t_1 = cos(phi2) * sin((lambda1 - lambda2)); tmp = 0.0; if (phi1 <= 3.1e-7) tmp = lambda1 + atan2(t_1, ((cos(phi2) * t_0) + 1.0)); else tmp = lambda1 + atan2(t_1, (t_0 + cos(phi1))); end tmp_2 = tmp; end
code[lambda1_, lambda2_, phi1_, phi2_] := Block[{t$95$0 = N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]}, Block[{t$95$1 = N[(N[Cos[phi2], $MachinePrecision] * N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[phi1, 3.1e-7], N[(lambda1 + N[ArcTan[t$95$1 / N[(N[(N[Cos[phi2], $MachinePrecision] * t$95$0), $MachinePrecision] + 1.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(lambda1 + N[ArcTan[t$95$1 / N[(t$95$0 + N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \cos \left(\lambda_1 - \lambda_2\right)\\
t_1 := \cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)\\
\mathbf{if}\;\phi_1 \leq 3.1 \cdot 10^{-7}:\\
\;\;\;\;\lambda_1 + \tan^{-1}_* \frac{t\_1}{\cos \phi_2 \cdot t\_0 + 1}\\
\mathbf{else}:\\
\;\;\;\;\lambda_1 + \tan^{-1}_* \frac{t\_1}{t\_0 + \cos \phi_1}\\
\end{array}
\end{array}
if phi1 < 3.1e-7Initial program 99.7%
Taylor expanded in phi1 around 0 85.8%
if 3.1e-7 < phi1 Initial program 99.7%
Taylor expanded in phi2 around 0 80.4%
Final simplification84.4%
(FPCore (lambda1 lambda2 phi1 phi2) :precision binary64 (+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ (cos (- lambda1 lambda2)) (cos phi1)))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos((lambda1 - lambda2)) + cos(phi1)));
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
code = lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos((lambda1 - lambda2)) + cos(phi1)))
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + Math.atan2((Math.cos(phi2) * Math.sin((lambda1 - lambda2))), (Math.cos((lambda1 - lambda2)) + Math.cos(phi1)));
}
def code(lambda1, lambda2, phi1, phi2): return lambda1 + math.atan2((math.cos(phi2) * math.sin((lambda1 - lambda2))), (math.cos((lambda1 - lambda2)) + math.cos(phi1)))
function code(lambda1, lambda2, phi1, phi2) return Float64(lambda1 + atan(Float64(cos(phi2) * sin(Float64(lambda1 - lambda2))), Float64(cos(Float64(lambda1 - lambda2)) + cos(phi1)))) end
function tmp = code(lambda1, lambda2, phi1, phi2) tmp = lambda1 + atan2((cos(phi2) * sin((lambda1 - lambda2))), (cos((lambda1 - lambda2)) + cos(phi1))); end
code[lambda1_, lambda2_, phi1_, phi2_] := N[(lambda1 + N[ArcTan[N[(N[Cos[phi2], $MachinePrecision] * N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] / N[(N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision] + N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{\cos \left(\lambda_1 - \lambda_2\right) + \cos \phi_1}
\end{array}
Initial program 99.7%
Taylor expanded in phi2 around 0 75.8%
Final simplification75.8%
(FPCore (lambda1 lambda2 phi1 phi2) :precision binary64 (+ lambda1 (atan2 (sin (- lambda1 lambda2)) (+ (cos phi1) (* (cos phi2) (cos (- lambda1 lambda2)))))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + atan2(sin((lambda1 - lambda2)), (cos(phi1) + (cos(phi2) * cos((lambda1 - lambda2)))));
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
code = lambda1 + atan2(sin((lambda1 - lambda2)), (cos(phi1) + (cos(phi2) * cos((lambda1 - lambda2)))))
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + Math.atan2(Math.sin((lambda1 - lambda2)), (Math.cos(phi1) + (Math.cos(phi2) * Math.cos((lambda1 - lambda2)))));
}
def code(lambda1, lambda2, phi1, phi2): return lambda1 + math.atan2(math.sin((lambda1 - lambda2)), (math.cos(phi1) + (math.cos(phi2) * math.cos((lambda1 - lambda2)))))
function code(lambda1, lambda2, phi1, phi2) return Float64(lambda1 + atan(sin(Float64(lambda1 - lambda2)), Float64(cos(phi1) + Float64(cos(phi2) * cos(Float64(lambda1 - lambda2)))))) end
function tmp = code(lambda1, lambda2, phi1, phi2) tmp = lambda1 + atan2(sin((lambda1 - lambda2)), (cos(phi1) + (cos(phi2) * cos((lambda1 - lambda2))))); end
code[lambda1_, lambda2_, phi1_, phi2_] := N[(lambda1 + N[ArcTan[N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision] / N[(N[Cos[phi1], $MachinePrecision] + N[(N[Cos[phi2], $MachinePrecision] * N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\lambda_1 + \tan^{-1}_* \frac{\sin \left(\lambda_1 - \lambda_2\right)}{\cos \phi_1 + \cos \phi_2 \cdot \cos \left(\lambda_1 - \lambda_2\right)}
\end{array}
Initial program 99.7%
Taylor expanded in phi2 around 0 74.3%
(FPCore (lambda1 lambda2 phi1 phi2) :precision binary64 (if (or (<= lambda2 -5e-14) (not (<= lambda2 1e-14))) (+ lambda1 (atan2 (sin (- lambda2)) (+ (cos phi1) (cos lambda2)))) (+ lambda1 (atan2 (sin (- lambda1 lambda2)) (+ (cos phi1) 1.0)))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
double tmp;
if ((lambda2 <= -5e-14) || !(lambda2 <= 1e-14)) {
tmp = lambda1 + atan2(sin(-lambda2), (cos(phi1) + cos(lambda2)));
} else {
tmp = lambda1 + atan2(sin((lambda1 - lambda2)), (cos(phi1) + 1.0));
}
return tmp;
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
real(8) :: tmp
if ((lambda2 <= (-5d-14)) .or. (.not. (lambda2 <= 1d-14))) then
tmp = lambda1 + atan2(sin(-lambda2), (cos(phi1) + cos(lambda2)))
else
tmp = lambda1 + atan2(sin((lambda1 - lambda2)), (cos(phi1) + 1.0d0))
end if
code = tmp
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
double tmp;
if ((lambda2 <= -5e-14) || !(lambda2 <= 1e-14)) {
tmp = lambda1 + Math.atan2(Math.sin(-lambda2), (Math.cos(phi1) + Math.cos(lambda2)));
} else {
tmp = lambda1 + Math.atan2(Math.sin((lambda1 - lambda2)), (Math.cos(phi1) + 1.0));
}
return tmp;
}
def code(lambda1, lambda2, phi1, phi2): tmp = 0 if (lambda2 <= -5e-14) or not (lambda2 <= 1e-14): tmp = lambda1 + math.atan2(math.sin(-lambda2), (math.cos(phi1) + math.cos(lambda2))) else: tmp = lambda1 + math.atan2(math.sin((lambda1 - lambda2)), (math.cos(phi1) + 1.0)) return tmp
function code(lambda1, lambda2, phi1, phi2) tmp = 0.0 if ((lambda2 <= -5e-14) || !(lambda2 <= 1e-14)) tmp = Float64(lambda1 + atan(sin(Float64(-lambda2)), Float64(cos(phi1) + cos(lambda2)))); else tmp = Float64(lambda1 + atan(sin(Float64(lambda1 - lambda2)), Float64(cos(phi1) + 1.0))); end return tmp end
function tmp_2 = code(lambda1, lambda2, phi1, phi2) tmp = 0.0; if ((lambda2 <= -5e-14) || ~((lambda2 <= 1e-14))) tmp = lambda1 + atan2(sin(-lambda2), (cos(phi1) + cos(lambda2))); else tmp = lambda1 + atan2(sin((lambda1 - lambda2)), (cos(phi1) + 1.0)); end tmp_2 = tmp; end
code[lambda1_, lambda2_, phi1_, phi2_] := If[Or[LessEqual[lambda2, -5e-14], N[Not[LessEqual[lambda2, 1e-14]], $MachinePrecision]], N[(lambda1 + N[ArcTan[N[Sin[(-lambda2)], $MachinePrecision] / N[(N[Cos[phi1], $MachinePrecision] + N[Cos[lambda2], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(lambda1 + N[ArcTan[N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision] / N[(N[Cos[phi1], $MachinePrecision] + 1.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;\lambda_2 \leq -5 \cdot 10^{-14} \lor \neg \left(\lambda_2 \leq 10^{-14}\right):\\
\;\;\;\;\lambda_1 + \tan^{-1}_* \frac{\sin \left(-\lambda_2\right)}{\cos \phi_1 + \cos \lambda_2}\\
\mathbf{else}:\\
\;\;\;\;\lambda_1 + \tan^{-1}_* \frac{\sin \left(\lambda_1 - \lambda_2\right)}{\cos \phi_1 + 1}\\
\end{array}
\end{array}
if lambda2 < -5.0000000000000002e-14 or 9.99999999999999999e-15 < lambda2 Initial program 99.7%
Taylor expanded in phi2 around 0 74.5%
Taylor expanded in lambda1 around 0 74.3%
+-commutative74.3%
fma-define74.3%
cos-neg74.3%
Simplified74.3%
Taylor expanded in phi2 around 0 74.3%
+-commutative74.3%
Simplified74.3%
Taylor expanded in lambda1 around 0 74.3%
if -5.0000000000000002e-14 < lambda2 < 9.99999999999999999e-15Initial program 99.7%
Taylor expanded in phi2 around 0 74.0%
Taylor expanded in lambda1 around 0 73.4%
+-commutative73.4%
fma-define73.4%
cos-neg73.4%
Simplified73.4%
Taylor expanded in phi2 around 0 72.9%
+-commutative72.9%
Simplified72.9%
Taylor expanded in lambda2 around 0 72.9%
Final simplification73.7%
(FPCore (lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (sin (- lambda1 lambda2))))
(if (<= lambda1 -5.9e-74)
(+ lambda1 (atan2 t_0 (+ (cos lambda2) 1.0)))
(if (<= lambda1 9.2e-61)
(atan2 t_0 (+ (cos phi1) (cos lambda2)))
(+ lambda1 (atan2 t_0 (+ (cos phi1) 1.0)))))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = sin((lambda1 - lambda2));
double tmp;
if (lambda1 <= -5.9e-74) {
tmp = lambda1 + atan2(t_0, (cos(lambda2) + 1.0));
} else if (lambda1 <= 9.2e-61) {
tmp = atan2(t_0, (cos(phi1) + cos(lambda2)));
} else {
tmp = lambda1 + atan2(t_0, (cos(phi1) + 1.0));
}
return tmp;
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
real(8) :: t_0
real(8) :: tmp
t_0 = sin((lambda1 - lambda2))
if (lambda1 <= (-5.9d-74)) then
tmp = lambda1 + atan2(t_0, (cos(lambda2) + 1.0d0))
else if (lambda1 <= 9.2d-61) then
tmp = atan2(t_0, (cos(phi1) + cos(lambda2)))
else
tmp = lambda1 + atan2(t_0, (cos(phi1) + 1.0d0))
end if
code = tmp
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = Math.sin((lambda1 - lambda2));
double tmp;
if (lambda1 <= -5.9e-74) {
tmp = lambda1 + Math.atan2(t_0, (Math.cos(lambda2) + 1.0));
} else if (lambda1 <= 9.2e-61) {
tmp = Math.atan2(t_0, (Math.cos(phi1) + Math.cos(lambda2)));
} else {
tmp = lambda1 + Math.atan2(t_0, (Math.cos(phi1) + 1.0));
}
return tmp;
}
def code(lambda1, lambda2, phi1, phi2): t_0 = math.sin((lambda1 - lambda2)) tmp = 0 if lambda1 <= -5.9e-74: tmp = lambda1 + math.atan2(t_0, (math.cos(lambda2) + 1.0)) elif lambda1 <= 9.2e-61: tmp = math.atan2(t_0, (math.cos(phi1) + math.cos(lambda2))) else: tmp = lambda1 + math.atan2(t_0, (math.cos(phi1) + 1.0)) return tmp
function code(lambda1, lambda2, phi1, phi2) t_0 = sin(Float64(lambda1 - lambda2)) tmp = 0.0 if (lambda1 <= -5.9e-74) tmp = Float64(lambda1 + atan(t_0, Float64(cos(lambda2) + 1.0))); elseif (lambda1 <= 9.2e-61) tmp = atan(t_0, Float64(cos(phi1) + cos(lambda2))); else tmp = Float64(lambda1 + atan(t_0, Float64(cos(phi1) + 1.0))); end return tmp end
function tmp_2 = code(lambda1, lambda2, phi1, phi2) t_0 = sin((lambda1 - lambda2)); tmp = 0.0; if (lambda1 <= -5.9e-74) tmp = lambda1 + atan2(t_0, (cos(lambda2) + 1.0)); elseif (lambda1 <= 9.2e-61) tmp = atan2(t_0, (cos(phi1) + cos(lambda2))); else tmp = lambda1 + atan2(t_0, (cos(phi1) + 1.0)); end tmp_2 = tmp; end
code[lambda1_, lambda2_, phi1_, phi2_] := Block[{t$95$0 = N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]}, If[LessEqual[lambda1, -5.9e-74], N[(lambda1 + N[ArcTan[t$95$0 / N[(N[Cos[lambda2], $MachinePrecision] + 1.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], If[LessEqual[lambda1, 9.2e-61], N[ArcTan[t$95$0 / N[(N[Cos[phi1], $MachinePrecision] + N[Cos[lambda2], $MachinePrecision]), $MachinePrecision]], $MachinePrecision], N[(lambda1 + N[ArcTan[t$95$0 / N[(N[Cos[phi1], $MachinePrecision] + 1.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \sin \left(\lambda_1 - \lambda_2\right)\\
\mathbf{if}\;\lambda_1 \leq -5.9 \cdot 10^{-74}:\\
\;\;\;\;\lambda_1 + \tan^{-1}_* \frac{t\_0}{\cos \lambda_2 + 1}\\
\mathbf{elif}\;\lambda_1 \leq 9.2 \cdot 10^{-61}:\\
\;\;\;\;\tan^{-1}_* \frac{t\_0}{\cos \phi_1 + \cos \lambda_2}\\
\mathbf{else}:\\
\;\;\;\;\lambda_1 + \tan^{-1}_* \frac{t\_0}{\cos \phi_1 + 1}\\
\end{array}
\end{array}
if lambda1 < -5.89999999999999965e-74Initial program 99.7%
Taylor expanded in phi2 around 0 86.4%
Taylor expanded in lambda1 around 0 85.9%
+-commutative85.9%
fma-define85.9%
cos-neg85.9%
Simplified85.9%
Taylor expanded in phi2 around 0 86.0%
+-commutative86.0%
Simplified86.0%
Taylor expanded in phi1 around 0 84.4%
if -5.89999999999999965e-74 < lambda1 < 9.19999999999999967e-61Initial program 99.6%
Taylor expanded in phi2 around 0 52.4%
Taylor expanded in lambda1 around 0 52.4%
+-commutative52.4%
fma-define52.4%
cos-neg52.4%
Simplified52.4%
Taylor expanded in phi2 around 0 51.7%
+-commutative51.7%
Simplified51.7%
Taylor expanded in lambda1 around 0 46.7%
+-commutative46.7%
Simplified46.7%
if 9.19999999999999967e-61 < lambda1 Initial program 99.9%
Taylor expanded in phi2 around 0 92.1%
Taylor expanded in lambda1 around 0 91.3%
+-commutative91.3%
fma-define91.3%
cos-neg91.3%
Simplified91.3%
Taylor expanded in phi2 around 0 91.4%
+-commutative91.4%
Simplified91.4%
Taylor expanded in lambda2 around 0 89.1%
Final simplification70.5%
(FPCore (lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (sin (- lambda1 lambda2))))
(if (<= (cos phi1) 0.973)
(+ lambda1 (atan2 t_0 (+ (cos phi1) 1.0)))
(+ lambda1 (atan2 t_0 (+ (cos lambda2) 1.0))))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = sin((lambda1 - lambda2));
double tmp;
if (cos(phi1) <= 0.973) {
tmp = lambda1 + atan2(t_0, (cos(phi1) + 1.0));
} else {
tmp = lambda1 + atan2(t_0, (cos(lambda2) + 1.0));
}
return tmp;
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
real(8) :: t_0
real(8) :: tmp
t_0 = sin((lambda1 - lambda2))
if (cos(phi1) <= 0.973d0) then
tmp = lambda1 + atan2(t_0, (cos(phi1) + 1.0d0))
else
tmp = lambda1 + atan2(t_0, (cos(lambda2) + 1.0d0))
end if
code = tmp
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = Math.sin((lambda1 - lambda2));
double tmp;
if (Math.cos(phi1) <= 0.973) {
tmp = lambda1 + Math.atan2(t_0, (Math.cos(phi1) + 1.0));
} else {
tmp = lambda1 + Math.atan2(t_0, (Math.cos(lambda2) + 1.0));
}
return tmp;
}
def code(lambda1, lambda2, phi1, phi2): t_0 = math.sin((lambda1 - lambda2)) tmp = 0 if math.cos(phi1) <= 0.973: tmp = lambda1 + math.atan2(t_0, (math.cos(phi1) + 1.0)) else: tmp = lambda1 + math.atan2(t_0, (math.cos(lambda2) + 1.0)) return tmp
function code(lambda1, lambda2, phi1, phi2) t_0 = sin(Float64(lambda1 - lambda2)) tmp = 0.0 if (cos(phi1) <= 0.973) tmp = Float64(lambda1 + atan(t_0, Float64(cos(phi1) + 1.0))); else tmp = Float64(lambda1 + atan(t_0, Float64(cos(lambda2) + 1.0))); end return tmp end
function tmp_2 = code(lambda1, lambda2, phi1, phi2) t_0 = sin((lambda1 - lambda2)); tmp = 0.0; if (cos(phi1) <= 0.973) tmp = lambda1 + atan2(t_0, (cos(phi1) + 1.0)); else tmp = lambda1 + atan2(t_0, (cos(lambda2) + 1.0)); end tmp_2 = tmp; end
code[lambda1_, lambda2_, phi1_, phi2_] := Block[{t$95$0 = N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]}, If[LessEqual[N[Cos[phi1], $MachinePrecision], 0.973], N[(lambda1 + N[ArcTan[t$95$0 / N[(N[Cos[phi1], $MachinePrecision] + 1.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(lambda1 + N[ArcTan[t$95$0 / N[(N[Cos[lambda2], $MachinePrecision] + 1.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \sin \left(\lambda_1 - \lambda_2\right)\\
\mathbf{if}\;\cos \phi_1 \leq 0.973:\\
\;\;\;\;\lambda_1 + \tan^{-1}_* \frac{t\_0}{\cos \phi_1 + 1}\\
\mathbf{else}:\\
\;\;\;\;\lambda_1 + \tan^{-1}_* \frac{t\_0}{\cos \lambda_2 + 1}\\
\end{array}
\end{array}
if (cos.f64 phi1) < 0.972999999999999976Initial program 99.8%
Taylor expanded in phi2 around 0 80.3%
Taylor expanded in lambda1 around 0 79.6%
+-commutative79.6%
fma-define79.6%
cos-neg79.6%
Simplified79.6%
Taylor expanded in phi2 around 0 78.8%
+-commutative78.8%
Simplified78.8%
Taylor expanded in lambda2 around 0 67.3%
if 0.972999999999999976 < (cos.f64 phi1) Initial program 99.6%
Taylor expanded in phi2 around 0 68.6%
Taylor expanded in lambda1 around 0 68.5%
+-commutative68.5%
fma-define68.5%
cos-neg68.5%
Simplified68.5%
Taylor expanded in phi2 around 0 68.8%
+-commutative68.8%
Simplified68.8%
Taylor expanded in phi1 around 0 67.1%
Final simplification67.2%
(FPCore (lambda1 lambda2 phi1 phi2) :precision binary64 (+ lambda1 (atan2 (sin (- lambda1 lambda2)) (+ (cos (- lambda1 lambda2)) (cos phi1)))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + atan2(sin((lambda1 - lambda2)), (cos((lambda1 - lambda2)) + cos(phi1)));
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
code = lambda1 + atan2(sin((lambda1 - lambda2)), (cos((lambda1 - lambda2)) + cos(phi1)))
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + Math.atan2(Math.sin((lambda1 - lambda2)), (Math.cos((lambda1 - lambda2)) + Math.cos(phi1)));
}
def code(lambda1, lambda2, phi1, phi2): return lambda1 + math.atan2(math.sin((lambda1 - lambda2)), (math.cos((lambda1 - lambda2)) + math.cos(phi1)))
function code(lambda1, lambda2, phi1, phi2) return Float64(lambda1 + atan(sin(Float64(lambda1 - lambda2)), Float64(cos(Float64(lambda1 - lambda2)) + cos(phi1)))) end
function tmp = code(lambda1, lambda2, phi1, phi2) tmp = lambda1 + atan2(sin((lambda1 - lambda2)), (cos((lambda1 - lambda2)) + cos(phi1))); end
code[lambda1_, lambda2_, phi1_, phi2_] := N[(lambda1 + N[ArcTan[N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision] / N[(N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision] + N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\lambda_1 + \tan^{-1}_* \frac{\sin \left(\lambda_1 - \lambda_2\right)}{\cos \left(\lambda_1 - \lambda_2\right) + \cos \phi_1}
\end{array}
Initial program 99.7%
Taylor expanded in phi2 around 0 74.3%
Taylor expanded in phi2 around 0 74.0%
Final simplification74.0%
(FPCore (lambda1 lambda2 phi1 phi2) :precision binary64 (+ lambda1 (atan2 (sin (- lambda1 lambda2)) (+ (cos phi1) (cos lambda2)))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + atan2(sin((lambda1 - lambda2)), (cos(phi1) + cos(lambda2)));
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
code = lambda1 + atan2(sin((lambda1 - lambda2)), (cos(phi1) + cos(lambda2)))
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + Math.atan2(Math.sin((lambda1 - lambda2)), (Math.cos(phi1) + Math.cos(lambda2)));
}
def code(lambda1, lambda2, phi1, phi2): return lambda1 + math.atan2(math.sin((lambda1 - lambda2)), (math.cos(phi1) + math.cos(lambda2)))
function code(lambda1, lambda2, phi1, phi2) return Float64(lambda1 + atan(sin(Float64(lambda1 - lambda2)), Float64(cos(phi1) + cos(lambda2)))) end
function tmp = code(lambda1, lambda2, phi1, phi2) tmp = lambda1 + atan2(sin((lambda1 - lambda2)), (cos(phi1) + cos(lambda2))); end
code[lambda1_, lambda2_, phi1_, phi2_] := N[(lambda1 + N[ArcTan[N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision] / N[(N[Cos[phi1], $MachinePrecision] + N[Cos[lambda2], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\lambda_1 + \tan^{-1}_* \frac{\sin \left(\lambda_1 - \lambda_2\right)}{\cos \phi_1 + \cos \lambda_2}
\end{array}
Initial program 99.7%
Taylor expanded in phi2 around 0 74.3%
Taylor expanded in lambda1 around 0 73.9%
+-commutative73.9%
fma-define73.9%
cos-neg73.9%
Simplified73.9%
Taylor expanded in phi2 around 0 73.7%
+-commutative73.7%
Simplified73.7%
(FPCore (lambda1 lambda2 phi1 phi2) :precision binary64 (+ lambda1 (atan2 (sin (- lambda1 lambda2)) (+ (cos lambda2) 1.0))))
double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + atan2(sin((lambda1 - lambda2)), (cos(lambda2) + 1.0));
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
code = lambda1 + atan2(sin((lambda1 - lambda2)), (cos(lambda2) + 1.0d0))
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1 + Math.atan2(Math.sin((lambda1 - lambda2)), (Math.cos(lambda2) + 1.0));
}
def code(lambda1, lambda2, phi1, phi2): return lambda1 + math.atan2(math.sin((lambda1 - lambda2)), (math.cos(lambda2) + 1.0))
function code(lambda1, lambda2, phi1, phi2) return Float64(lambda1 + atan(sin(Float64(lambda1 - lambda2)), Float64(cos(lambda2) + 1.0))) end
function tmp = code(lambda1, lambda2, phi1, phi2) tmp = lambda1 + atan2(sin((lambda1 - lambda2)), (cos(lambda2) + 1.0)); end
code[lambda1_, lambda2_, phi1_, phi2_] := N[(lambda1 + N[ArcTan[N[Sin[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision] / N[(N[Cos[lambda2], $MachinePrecision] + 1.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\lambda_1 + \tan^{-1}_* \frac{\sin \left(\lambda_1 - \lambda_2\right)}{\cos \lambda_2 + 1}
\end{array}
Initial program 99.7%
Taylor expanded in phi2 around 0 74.3%
Taylor expanded in lambda1 around 0 73.9%
+-commutative73.9%
fma-define73.9%
cos-neg73.9%
Simplified73.9%
Taylor expanded in phi2 around 0 73.7%
+-commutative73.7%
Simplified73.7%
Taylor expanded in phi1 around 0 64.0%
Final simplification64.0%
(FPCore (lambda1 lambda2 phi1 phi2) :precision binary64 lambda1)
double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1;
}
real(8) function code(lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
code = lambda1
end function
public static double code(double lambda1, double lambda2, double phi1, double phi2) {
return lambda1;
}
def code(lambda1, lambda2, phi1, phi2): return lambda1
function code(lambda1, lambda2, phi1, phi2) return lambda1 end
function tmp = code(lambda1, lambda2, phi1, phi2) tmp = lambda1; end
code[lambda1_, lambda2_, phi1_, phi2_] := lambda1
\begin{array}{l}
\\
\lambda_1
\end{array}
Initial program 99.7%
expm1-log1p-u99.7%
expm1-undefine99.7%
Applied egg-rr99.7%
expm1-define99.7%
Simplified99.7%
Taylor expanded in lambda1 around inf 50.3%
herbie shell --seed 2024163
(FPCore (lambda1 lambda2 phi1 phi2)
:name "Midpoint on a great circle"
:precision binary64
(+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ (cos phi1) (* (cos phi2) (cos (- lambda1 lambda2)))))))