
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(*
(acos
(+
(* (sin phi1) (sin phi2))
(* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2)))))
R))
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
return acos(((sin(phi1) * sin(phi2)) + ((cos(phi1) * cos(phi2)) * cos((lambda1 - lambda2))))) * R;
}
real(8) function code(r, lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: r
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
code = acos(((sin(phi1) * sin(phi2)) + ((cos(phi1) * cos(phi2)) * cos((lambda1 - lambda2))))) * r
end function
public static double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
return Math.acos(((Math.sin(phi1) * Math.sin(phi2)) + ((Math.cos(phi1) * Math.cos(phi2)) * Math.cos((lambda1 - lambda2))))) * R;
}
def code(R, lambda1, lambda2, phi1, phi2): return math.acos(((math.sin(phi1) * math.sin(phi2)) + ((math.cos(phi1) * math.cos(phi2)) * math.cos((lambda1 - lambda2))))) * R
function code(R, lambda1, lambda2, phi1, phi2) return Float64(acos(Float64(Float64(sin(phi1) * sin(phi2)) + Float64(Float64(cos(phi1) * cos(phi2)) * cos(Float64(lambda1 - lambda2))))) * R) end
function tmp = code(R, lambda1, lambda2, phi1, phi2) tmp = acos(((sin(phi1) * sin(phi2)) + ((cos(phi1) * cos(phi2)) * cos((lambda1 - lambda2))))) * R; end
code[R_, lambda1_, lambda2_, phi1_, phi2_] := N[(N[ArcCos[N[(N[(N[Sin[phi1], $MachinePrecision] * N[Sin[phi2], $MachinePrecision]), $MachinePrecision] + N[(N[(N[Cos[phi1], $MachinePrecision] * N[Cos[phi2], $MachinePrecision]), $MachinePrecision] * N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]
\begin{array}{l}
\\
\cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)\right) \cdot R
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 19 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(*
(acos
(+
(* (sin phi1) (sin phi2))
(* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2)))))
R))
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
return acos(((sin(phi1) * sin(phi2)) + ((cos(phi1) * cos(phi2)) * cos((lambda1 - lambda2))))) * R;
}
real(8) function code(r, lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: r
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
code = acos(((sin(phi1) * sin(phi2)) + ((cos(phi1) * cos(phi2)) * cos((lambda1 - lambda2))))) * r
end function
public static double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
return Math.acos(((Math.sin(phi1) * Math.sin(phi2)) + ((Math.cos(phi1) * Math.cos(phi2)) * Math.cos((lambda1 - lambda2))))) * R;
}
def code(R, lambda1, lambda2, phi1, phi2): return math.acos(((math.sin(phi1) * math.sin(phi2)) + ((math.cos(phi1) * math.cos(phi2)) * math.cos((lambda1 - lambda2))))) * R
function code(R, lambda1, lambda2, phi1, phi2) return Float64(acos(Float64(Float64(sin(phi1) * sin(phi2)) + Float64(Float64(cos(phi1) * cos(phi2)) * cos(Float64(lambda1 - lambda2))))) * R) end
function tmp = code(R, lambda1, lambda2, phi1, phi2) tmp = acos(((sin(phi1) * sin(phi2)) + ((cos(phi1) * cos(phi2)) * cos((lambda1 - lambda2))))) * R; end
code[R_, lambda1_, lambda2_, phi1_, phi2_] := N[(N[ArcCos[N[(N[(N[Sin[phi1], $MachinePrecision] * N[Sin[phi2], $MachinePrecision]), $MachinePrecision] + N[(N[(N[Cos[phi1], $MachinePrecision] * N[Cos[phi2], $MachinePrecision]), $MachinePrecision] * N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]
\begin{array}{l}
\\
\cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)\right) \cdot R
\end{array}
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(*
(acos
(+
(* (sin phi1) (sin phi2))
(fma
(* (* (cos phi2) (cos phi1)) (sin lambda1))
(sin lambda2)
(* (* (* (cos lambda2) (cos lambda1)) (cos phi2)) (cos phi1)))))
R))assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
return acos(((sin(phi1) * sin(phi2)) + fma(((cos(phi2) * cos(phi1)) * sin(lambda1)), sin(lambda2), (((cos(lambda2) * cos(lambda1)) * cos(phi2)) * cos(phi1))))) * R;
}
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) return Float64(acos(Float64(Float64(sin(phi1) * sin(phi2)) + fma(Float64(Float64(cos(phi2) * cos(phi1)) * sin(lambda1)), sin(lambda2), Float64(Float64(Float64(cos(lambda2) * cos(lambda1)) * cos(phi2)) * cos(phi1))))) * R) end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function. code[R_, lambda1_, lambda2_, phi1_, phi2_] := N[(N[ArcCos[N[(N[(N[Sin[phi1], $MachinePrecision] * N[Sin[phi2], $MachinePrecision]), $MachinePrecision] + N[(N[(N[(N[Cos[phi2], $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision] * N[Sin[lambda1], $MachinePrecision]), $MachinePrecision] * N[Sin[lambda2], $MachinePrecision] + N[(N[(N[(N[Cos[lambda2], $MachinePrecision] * N[Cos[lambda1], $MachinePrecision]), $MachinePrecision] * N[Cos[phi2], $MachinePrecision]), $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \mathsf{fma}\left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \sin \lambda_1, \sin \lambda_2, \left(\left(\cos \lambda_2 \cdot \cos \lambda_1\right) \cdot \cos \phi_2\right) \cdot \cos \phi_1\right)\right) \cdot R
\end{array}
Initial program 74.3%
lift-*.f64N/A
lift-cos.f64N/A
lift--.f64N/A
cos-diffN/A
+-commutativeN/A
distribute-lft-inN/A
associate-*r*N/A
lower-fma.f64N/A
lower-*.f64N/A
lift-*.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-sin.f64N/A
lower-sin.f64N/A
*-commutativeN/A
lift-*.f64N/A
*-commutativeN/A
associate-*r*N/A
Applied rewrites93.1%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(*
(acos
(fma
(*
(fma (cos lambda1) (cos lambda2) (* (sin lambda1) (sin lambda2)))
(cos phi2))
(cos phi1)
(* (sin phi2) (sin phi1))))
R))assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
return acos(fma((fma(cos(lambda1), cos(lambda2), (sin(lambda1) * sin(lambda2))) * cos(phi2)), cos(phi1), (sin(phi2) * sin(phi1)))) * R;
}
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) return Float64(acos(fma(Float64(fma(cos(lambda1), cos(lambda2), Float64(sin(lambda1) * sin(lambda2))) * cos(phi2)), cos(phi1), Float64(sin(phi2) * sin(phi1)))) * R) end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function. code[R_, lambda1_, lambda2_, phi1_, phi2_] := N[(N[ArcCos[N[(N[(N[(N[Cos[lambda1], $MachinePrecision] * N[Cos[lambda2], $MachinePrecision] + N[(N[Sin[lambda1], $MachinePrecision] * N[Sin[lambda2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[Cos[phi2], $MachinePrecision]), $MachinePrecision] * N[Cos[phi1], $MachinePrecision] + N[(N[Sin[phi2], $MachinePrecision] * N[Sin[phi1], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\cos^{-1} \left(\mathsf{fma}\left(\mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_1 \cdot \sin \lambda_2\right) \cdot \cos \phi_2, \cos \phi_1, \sin \phi_2 \cdot \sin \phi_1\right)\right) \cdot R
\end{array}
Initial program 74.3%
lift-cos.f64N/A
lift--.f64N/A
cos-diffN/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f64N/A
lower-sin.f64N/A
lower-sin.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-cos.f64N/A
lower-cos.f6493.1
Applied rewrites93.1%
Taylor expanded in lambda1 around inf
*-commutativeN/A
lower-fma.f64N/A
Applied rewrites93.1%
Taylor expanded in lambda1 around inf
*-commutativeN/A
lower-fma.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-fma.f64N/A
lower-cos.f64N/A
lower-cos.f64N/A
lower-*.f64N/A
lower-sin.f64N/A
lower-sin.f64N/A
lower-cos.f64N/A
lower-cos.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-sin.f64N/A
lower-sin.f6493.1
Applied rewrites93.1%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (* (cos (- lambda2 lambda1)) (cos phi1))))
(if (<= phi2 -7.8e-90)
(fma
(* 0.5 (PI))
R
(* (asin (fma t_0 (cos phi2) (* (sin phi2) (sin phi1)))) (- R)))
(if (<= phi2 7e-6)
(*
(acos
(+
(* (sin phi1) (sin phi2))
(*
(fma (sin lambda2) (sin lambda1) (* (cos lambda2) (cos lambda1)))
(cos phi1))))
R)
(* (acos (fma (sin phi2) (sin phi1) (* t_0 (cos phi2)))) R)))))\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\begin{array}{l}
t_0 := \cos \left(\lambda_2 - \lambda_1\right) \cdot \cos \phi_1\\
\mathbf{if}\;\phi_2 \leq -7.8 \cdot 10^{-90}:\\
\;\;\;\;\mathsf{fma}\left(0.5 \cdot \mathsf{PI}\left(\right), R, \sin^{-1} \left(\mathsf{fma}\left(t\_0, \cos \phi_2, \sin \phi_2 \cdot \sin \phi_1\right)\right) \cdot \left(-R\right)\right)\\
\mathbf{elif}\;\phi_2 \leq 7 \cdot 10^{-6}:\\
\;\;\;\;\cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right) \cdot \cos \phi_1\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\cos^{-1} \left(\mathsf{fma}\left(\sin \phi_2, \sin \phi_1, t\_0 \cdot \cos \phi_2\right)\right) \cdot R\\
\end{array}
\end{array}
if phi2 < -7.80000000000000009e-90Initial program 76.4%
lift-*.f64N/A
*-commutativeN/A
lift-acos.f64N/A
acos-asinN/A
sub-negN/A
distribute-rgt-inN/A
lower-fma.f64N/A
clear-numN/A
associate-/r/N/A
lower-*.f64N/A
metadata-evalN/A
lower-PI.f64N/A
lower-*.f64N/A
Applied rewrites76.7%
if -7.80000000000000009e-90 < phi2 < 6.99999999999999989e-6Initial program 70.7%
lift-*.f64N/A
lift-cos.f64N/A
lift--.f64N/A
cos-diffN/A
+-commutativeN/A
distribute-lft-inN/A
associate-*r*N/A
lower-fma.f64N/A
lower-*.f64N/A
lift-*.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-sin.f64N/A
lower-sin.f64N/A
*-commutativeN/A
lift-*.f64N/A
*-commutativeN/A
associate-*r*N/A
Applied rewrites89.4%
Taylor expanded in phi2 around 0
associate-*r*N/A
*-commutativeN/A
distribute-rgt-inN/A
*-commutativeN/A
lower-*.f64N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f64N/A
lower-sin.f64N/A
lower-sin.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-cos.f64N/A
lower-cos.f64N/A
lower-cos.f6489.4
Applied rewrites89.4%
if 6.99999999999999989e-6 < phi2 Initial program 78.5%
lift-+.f64N/A
lift-*.f64N/A
*-commutativeN/A
lower-fma.f6478.6
lift-*.f64N/A
*-commutativeN/A
lift-*.f64N/A
associate-*r*N/A
lower-*.f64N/A
lower-*.f6478.6
lift-cos.f64N/A
lift--.f64N/A
cos-diffN/A
*-commutativeN/A
*-commutativeN/A
cos-diffN/A
lower-cos.f64N/A
lower--.f6478.6
Applied rewrites78.6%
Final simplification83.0%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (* (cos (- lambda2 lambda1)) (cos phi1))))
(if (<= phi2 -7.8e-90)
(fma
(* 0.5 (PI))
R
(* (asin (fma t_0 (cos phi2) (* (sin phi2) (sin phi1)))) (- R)))
(if (<= phi2 2.5e-6)
(*
(acos
(*
(+ (* (sin lambda2) (sin lambda1)) (* (cos lambda1) (cos lambda2)))
(cos phi1)))
R)
(* (acos (fma (sin phi2) (sin phi1) (* t_0 (cos phi2)))) R)))))\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\begin{array}{l}
t_0 := \cos \left(\lambda_2 - \lambda_1\right) \cdot \cos \phi_1\\
\mathbf{if}\;\phi_2 \leq -7.8 \cdot 10^{-90}:\\
\;\;\;\;\mathsf{fma}\left(0.5 \cdot \mathsf{PI}\left(\right), R, \sin^{-1} \left(\mathsf{fma}\left(t\_0, \cos \phi_2, \sin \phi_2 \cdot \sin \phi_1\right)\right) \cdot \left(-R\right)\right)\\
\mathbf{elif}\;\phi_2 \leq 2.5 \cdot 10^{-6}:\\
\;\;\;\;\cos^{-1} \left(\left(\sin \lambda_2 \cdot \sin \lambda_1 + \cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \cos \phi_1\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\cos^{-1} \left(\mathsf{fma}\left(\sin \phi_2, \sin \phi_1, t\_0 \cdot \cos \phi_2\right)\right) \cdot R\\
\end{array}
\end{array}
if phi2 < -7.80000000000000009e-90Initial program 76.4%
lift-*.f64N/A
*-commutativeN/A
lift-acos.f64N/A
acos-asinN/A
sub-negN/A
distribute-rgt-inN/A
lower-fma.f64N/A
clear-numN/A
associate-/r/N/A
lower-*.f64N/A
metadata-evalN/A
lower-PI.f64N/A
lower-*.f64N/A
Applied rewrites76.7%
if -7.80000000000000009e-90 < phi2 < 2.5000000000000002e-6Initial program 70.7%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6470.7
Applied rewrites70.7%
Applied rewrites89.5%
if 2.5000000000000002e-6 < phi2 Initial program 78.5%
lift-+.f64N/A
lift-*.f64N/A
*-commutativeN/A
lower-fma.f6478.6
lift-*.f64N/A
*-commutativeN/A
lift-*.f64N/A
associate-*r*N/A
lower-*.f64N/A
lower-*.f6478.6
lift-cos.f64N/A
lift--.f64N/A
cos-diffN/A
*-commutativeN/A
*-commutativeN/A
cos-diffN/A
lower-cos.f64N/A
lower--.f6478.6
Applied rewrites78.6%
Final simplification83.1%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(if (or (<= phi2 -9e-8) (not (<= phi2 2.5e-6)))
(*
(acos
(fma
(sin phi2)
(sin phi1)
(* (* (cos (- lambda2 lambda1)) (cos phi1)) (cos phi2))))
R)
(*
(acos
(*
(+ (* (sin lambda2) (sin lambda1)) (* (cos lambda1) (cos lambda2)))
(cos phi1)))
R)))assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double tmp;
if ((phi2 <= -9e-8) || !(phi2 <= 2.5e-6)) {
tmp = acos(fma(sin(phi2), sin(phi1), ((cos((lambda2 - lambda1)) * cos(phi1)) * cos(phi2)))) * R;
} else {
tmp = acos((((sin(lambda2) * sin(lambda1)) + (cos(lambda1) * cos(lambda2))) * cos(phi1))) * R;
}
return tmp;
}
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) tmp = 0.0 if ((phi2 <= -9e-8) || !(phi2 <= 2.5e-6)) tmp = Float64(acos(fma(sin(phi2), sin(phi1), Float64(Float64(cos(Float64(lambda2 - lambda1)) * cos(phi1)) * cos(phi2)))) * R); else tmp = Float64(acos(Float64(Float64(Float64(sin(lambda2) * sin(lambda1)) + Float64(cos(lambda1) * cos(lambda2))) * cos(phi1))) * R); end return tmp end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function. code[R_, lambda1_, lambda2_, phi1_, phi2_] := If[Or[LessEqual[phi2, -9e-8], N[Not[LessEqual[phi2, 2.5e-6]], $MachinePrecision]], N[(N[ArcCos[N[(N[Sin[phi2], $MachinePrecision] * N[Sin[phi1], $MachinePrecision] + N[(N[(N[Cos[N[(lambda2 - lambda1), $MachinePrecision]], $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision] * N[Cos[phi2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision], N[(N[ArcCos[N[(N[(N[(N[Sin[lambda2], $MachinePrecision] * N[Sin[lambda1], $MachinePrecision]), $MachinePrecision] + N[(N[Cos[lambda1], $MachinePrecision] * N[Cos[lambda2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\begin{array}{l}
\mathbf{if}\;\phi_2 \leq -9 \cdot 10^{-8} \lor \neg \left(\phi_2 \leq 2.5 \cdot 10^{-6}\right):\\
\;\;\;\;\cos^{-1} \left(\mathsf{fma}\left(\sin \phi_2, \sin \phi_1, \left(\cos \left(\lambda_2 - \lambda_1\right) \cdot \cos \phi_1\right) \cdot \cos \phi_2\right)\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\cos^{-1} \left(\left(\sin \lambda_2 \cdot \sin \lambda_1 + \cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \cos \phi_1\right) \cdot R\\
\end{array}
\end{array}
if phi2 < -8.99999999999999986e-8 or 2.5000000000000002e-6 < phi2 Initial program 78.8%
lift-+.f64N/A
lift-*.f64N/A
*-commutativeN/A
lower-fma.f6478.8
lift-*.f64N/A
*-commutativeN/A
lift-*.f64N/A
associate-*r*N/A
lower-*.f64N/A
lower-*.f6478.9
lift-cos.f64N/A
lift--.f64N/A
cos-diffN/A
*-commutativeN/A
*-commutativeN/A
cos-diffN/A
lower-cos.f64N/A
lower--.f6478.9
Applied rewrites78.9%
if -8.99999999999999986e-8 < phi2 < 2.5000000000000002e-6Initial program 70.4%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6470.4
Applied rewrites70.4%
Applied rewrites87.7%
Final simplification83.6%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(if (<= lambda2 -1.4e-9)
(*
(acos
(*
(+ (* (sin lambda2) (sin lambda1)) (* (cos lambda1) (cos lambda2)))
(cos phi1)))
R)
(if (<= lambda2 8.8e-21)
(*
(acos
(fma (* (cos phi2) (cos phi1)) (cos lambda1) (* (sin phi2) (sin phi1))))
R)
(*
(acos
(+
(* (sin phi1) (sin phi2))
(* (* (cos lambda2) (cos phi2)) (cos phi1))))
R))))assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double tmp;
if (lambda2 <= -1.4e-9) {
tmp = acos((((sin(lambda2) * sin(lambda1)) + (cos(lambda1) * cos(lambda2))) * cos(phi1))) * R;
} else if (lambda2 <= 8.8e-21) {
tmp = acos(fma((cos(phi2) * cos(phi1)), cos(lambda1), (sin(phi2) * sin(phi1)))) * R;
} else {
tmp = acos(((sin(phi1) * sin(phi2)) + ((cos(lambda2) * cos(phi2)) * cos(phi1)))) * R;
}
return tmp;
}
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) tmp = 0.0 if (lambda2 <= -1.4e-9) tmp = Float64(acos(Float64(Float64(Float64(sin(lambda2) * sin(lambda1)) + Float64(cos(lambda1) * cos(lambda2))) * cos(phi1))) * R); elseif (lambda2 <= 8.8e-21) tmp = Float64(acos(fma(Float64(cos(phi2) * cos(phi1)), cos(lambda1), Float64(sin(phi2) * sin(phi1)))) * R); else tmp = Float64(acos(Float64(Float64(sin(phi1) * sin(phi2)) + Float64(Float64(cos(lambda2) * cos(phi2)) * cos(phi1)))) * R); end return tmp end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function. code[R_, lambda1_, lambda2_, phi1_, phi2_] := If[LessEqual[lambda2, -1.4e-9], N[(N[ArcCos[N[(N[(N[(N[Sin[lambda2], $MachinePrecision] * N[Sin[lambda1], $MachinePrecision]), $MachinePrecision] + N[(N[Cos[lambda1], $MachinePrecision] * N[Cos[lambda2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision], If[LessEqual[lambda2, 8.8e-21], N[(N[ArcCos[N[(N[(N[Cos[phi2], $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision] * N[Cos[lambda1], $MachinePrecision] + N[(N[Sin[phi2], $MachinePrecision] * N[Sin[phi1], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision], N[(N[ArcCos[N[(N[(N[Sin[phi1], $MachinePrecision] * N[Sin[phi2], $MachinePrecision]), $MachinePrecision] + N[(N[(N[Cos[lambda2], $MachinePrecision] * N[Cos[phi2], $MachinePrecision]), $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]]]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\begin{array}{l}
\mathbf{if}\;\lambda_2 \leq -1.4 \cdot 10^{-9}:\\
\;\;\;\;\cos^{-1} \left(\left(\sin \lambda_2 \cdot \sin \lambda_1 + \cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \cos \phi_1\right) \cdot R\\
\mathbf{elif}\;\lambda_2 \leq 8.8 \cdot 10^{-21}:\\
\;\;\;\;\cos^{-1} \left(\mathsf{fma}\left(\cos \phi_2 \cdot \cos \phi_1, \cos \lambda_1, \sin \phi_2 \cdot \sin \phi_1\right)\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \lambda_2 \cdot \cos \phi_2\right) \cdot \cos \phi_1\right) \cdot R\\
\end{array}
\end{array}
if lambda2 < -1.39999999999999992e-9Initial program 59.2%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6439.8
Applied rewrites39.8%
Applied rewrites61.5%
if -1.39999999999999992e-9 < lambda2 < 8.8000000000000002e-21Initial program 87.9%
Taylor expanded in lambda2 around 0
*-commutativeN/A
lower-fma.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-cos.f64N/A
lower-cos.f64N/A
lower-cos.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-sin.f64N/A
lower-sin.f6487.9
Applied rewrites87.9%
if 8.8000000000000002e-21 < lambda2 Initial program 58.5%
Taylor expanded in lambda1 around 0
*-commutativeN/A
lower-*.f64N/A
*-commutativeN/A
lower-*.f64N/A
cos-negN/A
lower-cos.f64N/A
lower-cos.f64N/A
lower-cos.f6458.1
Applied rewrites58.1%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (* (sin phi2) (sin phi1))))
(if (<= lambda2 -1.4e-9)
(*
(acos
(*
(+ (* (sin lambda2) (sin lambda1)) (* (cos lambda1) (cos lambda2)))
(cos phi1)))
R)
(if (<= lambda2 2.6e-6)
(* (acos (fma (* (cos phi2) (cos phi1)) (cos lambda1) t_0)) R)
(* (acos (fma (* (cos lambda2) (cos phi2)) (cos phi1) t_0)) R)))))assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = sin(phi2) * sin(phi1);
double tmp;
if (lambda2 <= -1.4e-9) {
tmp = acos((((sin(lambda2) * sin(lambda1)) + (cos(lambda1) * cos(lambda2))) * cos(phi1))) * R;
} else if (lambda2 <= 2.6e-6) {
tmp = acos(fma((cos(phi2) * cos(phi1)), cos(lambda1), t_0)) * R;
} else {
tmp = acos(fma((cos(lambda2) * cos(phi2)), cos(phi1), t_0)) * R;
}
return tmp;
}
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) t_0 = Float64(sin(phi2) * sin(phi1)) tmp = 0.0 if (lambda2 <= -1.4e-9) tmp = Float64(acos(Float64(Float64(Float64(sin(lambda2) * sin(lambda1)) + Float64(cos(lambda1) * cos(lambda2))) * cos(phi1))) * R); elseif (lambda2 <= 2.6e-6) tmp = Float64(acos(fma(Float64(cos(phi2) * cos(phi1)), cos(lambda1), t_0)) * R); else tmp = Float64(acos(fma(Float64(cos(lambda2) * cos(phi2)), cos(phi1), t_0)) * R); end return tmp end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
code[R_, lambda1_, lambda2_, phi1_, phi2_] := Block[{t$95$0 = N[(N[Sin[phi2], $MachinePrecision] * N[Sin[phi1], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[lambda2, -1.4e-9], N[(N[ArcCos[N[(N[(N[(N[Sin[lambda2], $MachinePrecision] * N[Sin[lambda1], $MachinePrecision]), $MachinePrecision] + N[(N[Cos[lambda1], $MachinePrecision] * N[Cos[lambda2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision], If[LessEqual[lambda2, 2.6e-6], N[(N[ArcCos[N[(N[(N[Cos[phi2], $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision] * N[Cos[lambda1], $MachinePrecision] + t$95$0), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision], N[(N[ArcCos[N[(N[(N[Cos[lambda2], $MachinePrecision] * N[Cos[phi2], $MachinePrecision]), $MachinePrecision] * N[Cos[phi1], $MachinePrecision] + t$95$0), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]]]]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\begin{array}{l}
t_0 := \sin \phi_2 \cdot \sin \phi_1\\
\mathbf{if}\;\lambda_2 \leq -1.4 \cdot 10^{-9}:\\
\;\;\;\;\cos^{-1} \left(\left(\sin \lambda_2 \cdot \sin \lambda_1 + \cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \cos \phi_1\right) \cdot R\\
\mathbf{elif}\;\lambda_2 \leq 2.6 \cdot 10^{-6}:\\
\;\;\;\;\cos^{-1} \left(\mathsf{fma}\left(\cos \phi_2 \cdot \cos \phi_1, \cos \lambda_1, t\_0\right)\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\cos^{-1} \left(\mathsf{fma}\left(\cos \lambda_2 \cdot \cos \phi_2, \cos \phi_1, t\_0\right)\right) \cdot R\\
\end{array}
\end{array}
if lambda2 < -1.39999999999999992e-9Initial program 59.2%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6439.8
Applied rewrites39.8%
Applied rewrites61.5%
if -1.39999999999999992e-9 < lambda2 < 2.60000000000000009e-6Initial program 88.0%
Taylor expanded in lambda2 around 0
*-commutativeN/A
lower-fma.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-cos.f64N/A
lower-cos.f64N/A
lower-cos.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-sin.f64N/A
lower-sin.f6488.0
Applied rewrites88.0%
if 2.60000000000000009e-6 < lambda2 Initial program 57.7%
Taylor expanded in lambda1 around 0
*-commutativeN/A
lower-fma.f64N/A
*-commutativeN/A
lower-*.f64N/A
cos-negN/A
lower-cos.f64N/A
lower-cos.f64N/A
lower-cos.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-sin.f64N/A
lower-sin.f6457.4
Applied rewrites57.4%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (* (sin phi2) (sin phi1))))
(if (<= lambda2 -1.4e-9)
(*
(acos
(*
(fma (cos lambda2) (cos lambda1) (* (sin lambda2) (sin lambda1)))
(cos phi1)))
R)
(if (<= lambda2 2.6e-6)
(* (acos (fma (* (cos phi2) (cos phi1)) (cos lambda1) t_0)) R)
(* (acos (fma (* (cos lambda2) (cos phi2)) (cos phi1) t_0)) R)))))assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = sin(phi2) * sin(phi1);
double tmp;
if (lambda2 <= -1.4e-9) {
tmp = acos((fma(cos(lambda2), cos(lambda1), (sin(lambda2) * sin(lambda1))) * cos(phi1))) * R;
} else if (lambda2 <= 2.6e-6) {
tmp = acos(fma((cos(phi2) * cos(phi1)), cos(lambda1), t_0)) * R;
} else {
tmp = acos(fma((cos(lambda2) * cos(phi2)), cos(phi1), t_0)) * R;
}
return tmp;
}
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) t_0 = Float64(sin(phi2) * sin(phi1)) tmp = 0.0 if (lambda2 <= -1.4e-9) tmp = Float64(acos(Float64(fma(cos(lambda2), cos(lambda1), Float64(sin(lambda2) * sin(lambda1))) * cos(phi1))) * R); elseif (lambda2 <= 2.6e-6) tmp = Float64(acos(fma(Float64(cos(phi2) * cos(phi1)), cos(lambda1), t_0)) * R); else tmp = Float64(acos(fma(Float64(cos(lambda2) * cos(phi2)), cos(phi1), t_0)) * R); end return tmp end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
code[R_, lambda1_, lambda2_, phi1_, phi2_] := Block[{t$95$0 = N[(N[Sin[phi2], $MachinePrecision] * N[Sin[phi1], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[lambda2, -1.4e-9], N[(N[ArcCos[N[(N[(N[Cos[lambda2], $MachinePrecision] * N[Cos[lambda1], $MachinePrecision] + N[(N[Sin[lambda2], $MachinePrecision] * N[Sin[lambda1], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision], If[LessEqual[lambda2, 2.6e-6], N[(N[ArcCos[N[(N[(N[Cos[phi2], $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision] * N[Cos[lambda1], $MachinePrecision] + t$95$0), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision], N[(N[ArcCos[N[(N[(N[Cos[lambda2], $MachinePrecision] * N[Cos[phi2], $MachinePrecision]), $MachinePrecision] * N[Cos[phi1], $MachinePrecision] + t$95$0), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]]]]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\begin{array}{l}
t_0 := \sin \phi_2 \cdot \sin \phi_1\\
\mathbf{if}\;\lambda_2 \leq -1.4 \cdot 10^{-9}:\\
\;\;\;\;\cos^{-1} \left(\mathsf{fma}\left(\cos \lambda_2, \cos \lambda_1, \sin \lambda_2 \cdot \sin \lambda_1\right) \cdot \cos \phi_1\right) \cdot R\\
\mathbf{elif}\;\lambda_2 \leq 2.6 \cdot 10^{-6}:\\
\;\;\;\;\cos^{-1} \left(\mathsf{fma}\left(\cos \phi_2 \cdot \cos \phi_1, \cos \lambda_1, t\_0\right)\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\cos^{-1} \left(\mathsf{fma}\left(\cos \lambda_2 \cdot \cos \phi_2, \cos \phi_1, t\_0\right)\right) \cdot R\\
\end{array}
\end{array}
if lambda2 < -1.39999999999999992e-9Initial program 59.2%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6439.8
Applied rewrites39.8%
Applied rewrites61.5%
if -1.39999999999999992e-9 < lambda2 < 2.60000000000000009e-6Initial program 88.0%
Taylor expanded in lambda2 around 0
*-commutativeN/A
lower-fma.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-cos.f64N/A
lower-cos.f64N/A
lower-cos.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-sin.f64N/A
lower-sin.f6488.0
Applied rewrites88.0%
if 2.60000000000000009e-6 < lambda2 Initial program 57.7%
Taylor expanded in lambda1 around 0
*-commutativeN/A
lower-fma.f64N/A
*-commutativeN/A
lower-*.f64N/A
cos-negN/A
lower-cos.f64N/A
lower-cos.f64N/A
lower-cos.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-sin.f64N/A
lower-sin.f6457.4
Applied rewrites57.4%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(if (<= phi2 7e-6)
(*
(acos
(*
(fma (cos lambda2) (cos lambda1) (* (sin lambda2) (sin lambda1)))
(cos phi1)))
R)
(*
(acos
(fma (* (cos lambda2) (cos phi2)) (cos phi1) (* (sin phi2) (sin phi1))))
R)))assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double tmp;
if (phi2 <= 7e-6) {
tmp = acos((fma(cos(lambda2), cos(lambda1), (sin(lambda2) * sin(lambda1))) * cos(phi1))) * R;
} else {
tmp = acos(fma((cos(lambda2) * cos(phi2)), cos(phi1), (sin(phi2) * sin(phi1)))) * R;
}
return tmp;
}
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) tmp = 0.0 if (phi2 <= 7e-6) tmp = Float64(acos(Float64(fma(cos(lambda2), cos(lambda1), Float64(sin(lambda2) * sin(lambda1))) * cos(phi1))) * R); else tmp = Float64(acos(fma(Float64(cos(lambda2) * cos(phi2)), cos(phi1), Float64(sin(phi2) * sin(phi1)))) * R); end return tmp end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function. code[R_, lambda1_, lambda2_, phi1_, phi2_] := If[LessEqual[phi2, 7e-6], N[(N[ArcCos[N[(N[(N[Cos[lambda2], $MachinePrecision] * N[Cos[lambda1], $MachinePrecision] + N[(N[Sin[lambda2], $MachinePrecision] * N[Sin[lambda1], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision], N[(N[ArcCos[N[(N[(N[Cos[lambda2], $MachinePrecision] * N[Cos[phi2], $MachinePrecision]), $MachinePrecision] * N[Cos[phi1], $MachinePrecision] + N[(N[Sin[phi2], $MachinePrecision] * N[Sin[phi1], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\begin{array}{l}
\mathbf{if}\;\phi_2 \leq 7 \cdot 10^{-6}:\\
\;\;\;\;\cos^{-1} \left(\mathsf{fma}\left(\cos \lambda_2, \cos \lambda_1, \sin \lambda_2 \cdot \sin \lambda_1\right) \cdot \cos \phi_1\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\cos^{-1} \left(\mathsf{fma}\left(\cos \lambda_2 \cdot \cos \phi_2, \cos \phi_1, \sin \phi_2 \cdot \sin \phi_1\right)\right) \cdot R\\
\end{array}
\end{array}
if phi2 < 6.99999999999999989e-6Initial program 72.9%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6455.2
Applied rewrites55.2%
Applied rewrites67.5%
if 6.99999999999999989e-6 < phi2 Initial program 78.5%
Taylor expanded in lambda1 around 0
*-commutativeN/A
lower-fma.f64N/A
*-commutativeN/A
lower-*.f64N/A
cos-negN/A
lower-cos.f64N/A
lower-cos.f64N/A
lower-cos.f64N/A
*-commutativeN/A
lower-*.f64N/A
lower-sin.f64N/A
lower-sin.f6459.3
Applied rewrites59.3%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(if (<= phi2 1.45e-5)
(*
(acos
(*
(fma (cos lambda2) (cos lambda1) (* (sin lambda2) (sin lambda1)))
(cos phi1)))
R)
(* (acos (* (cos (- lambda1 lambda2)) (cos phi2))) R)))assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double tmp;
if (phi2 <= 1.45e-5) {
tmp = acos((fma(cos(lambda2), cos(lambda1), (sin(lambda2) * sin(lambda1))) * cos(phi1))) * R;
} else {
tmp = acos((cos((lambda1 - lambda2)) * cos(phi2))) * R;
}
return tmp;
}
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) tmp = 0.0 if (phi2 <= 1.45e-5) tmp = Float64(acos(Float64(fma(cos(lambda2), cos(lambda1), Float64(sin(lambda2) * sin(lambda1))) * cos(phi1))) * R); else tmp = Float64(acos(Float64(cos(Float64(lambda1 - lambda2)) * cos(phi2))) * R); end return tmp end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function. code[R_, lambda1_, lambda2_, phi1_, phi2_] := If[LessEqual[phi2, 1.45e-5], N[(N[ArcCos[N[(N[(N[Cos[lambda2], $MachinePrecision] * N[Cos[lambda1], $MachinePrecision] + N[(N[Sin[lambda2], $MachinePrecision] * N[Sin[lambda1], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision], N[(N[ArcCos[N[(N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision] * N[Cos[phi2], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\begin{array}{l}
\mathbf{if}\;\phi_2 \leq 1.45 \cdot 10^{-5}:\\
\;\;\;\;\cos^{-1} \left(\mathsf{fma}\left(\cos \lambda_2, \cos \lambda_1, \sin \lambda_2 \cdot \sin \lambda_1\right) \cdot \cos \phi_1\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\cos^{-1} \left(\cos \left(\lambda_1 - \lambda_2\right) \cdot \cos \phi_2\right) \cdot R\\
\end{array}
\end{array}
if phi2 < 1.45e-5Initial program 72.9%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6455.2
Applied rewrites55.2%
Applied rewrites67.5%
if 1.45e-5 < phi2 Initial program 78.5%
Taylor expanded in phi1 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6446.6
Applied rewrites46.6%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (cos (- lambda1 lambda2))))
(if (<= phi1 -14500000000000.0)
(* (acos (* t_0 (cos phi1))) R)
(* (acos (+ (* (sin phi1) (sin phi2)) (* (* t_0 (cos phi2)) 1.0))) R))))assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = cos((lambda1 - lambda2));
double tmp;
if (phi1 <= -14500000000000.0) {
tmp = acos((t_0 * cos(phi1))) * R;
} else {
tmp = acos(((sin(phi1) * sin(phi2)) + ((t_0 * cos(phi2)) * 1.0))) * R;
}
return tmp;
}
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
real(8) function code(r, lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: r
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 (phi1 <= (-14500000000000.0d0)) then
tmp = acos((t_0 * cos(phi1))) * r
else
tmp = acos(((sin(phi1) * sin(phi2)) + ((t_0 * cos(phi2)) * 1.0d0))) * r
end if
code = tmp
end function
assert R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2;
public static double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = Math.cos((lambda1 - lambda2));
double tmp;
if (phi1 <= -14500000000000.0) {
tmp = Math.acos((t_0 * Math.cos(phi1))) * R;
} else {
tmp = Math.acos(((Math.sin(phi1) * Math.sin(phi2)) + ((t_0 * Math.cos(phi2)) * 1.0))) * R;
}
return tmp;
}
[R, lambda1, lambda2, phi1, phi2] = sort([R, lambda1, lambda2, phi1, phi2]) def code(R, lambda1, lambda2, phi1, phi2): t_0 = math.cos((lambda1 - lambda2)) tmp = 0 if phi1 <= -14500000000000.0: tmp = math.acos((t_0 * math.cos(phi1))) * R else: tmp = math.acos(((math.sin(phi1) * math.sin(phi2)) + ((t_0 * math.cos(phi2)) * 1.0))) * R return tmp
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) t_0 = cos(Float64(lambda1 - lambda2)) tmp = 0.0 if (phi1 <= -14500000000000.0) tmp = Float64(acos(Float64(t_0 * cos(phi1))) * R); else tmp = Float64(acos(Float64(Float64(sin(phi1) * sin(phi2)) + Float64(Float64(t_0 * cos(phi2)) * 1.0))) * R); end return tmp end
R, lambda1, lambda2, phi1, phi2 = num2cell(sort([R, lambda1, lambda2, phi1, phi2])){:}
function tmp_2 = code(R, lambda1, lambda2, phi1, phi2)
t_0 = cos((lambda1 - lambda2));
tmp = 0.0;
if (phi1 <= -14500000000000.0)
tmp = acos((t_0 * cos(phi1))) * R;
else
tmp = acos(((sin(phi1) * sin(phi2)) + ((t_0 * cos(phi2)) * 1.0))) * R;
end
tmp_2 = tmp;
end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
code[R_, lambda1_, lambda2_, phi1_, phi2_] := Block[{t$95$0 = N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]}, If[LessEqual[phi1, -14500000000000.0], N[(N[ArcCos[N[(t$95$0 * N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision], N[(N[ArcCos[N[(N[(N[Sin[phi1], $MachinePrecision] * N[Sin[phi2], $MachinePrecision]), $MachinePrecision] + N[(N[(t$95$0 * N[Cos[phi2], $MachinePrecision]), $MachinePrecision] * 1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]]]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\begin{array}{l}
t_0 := \cos \left(\lambda_1 - \lambda_2\right)\\
\mathbf{if}\;\phi_1 \leq -14500000000000:\\
\;\;\;\;\cos^{-1} \left(t\_0 \cdot \cos \phi_1\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \left(t\_0 \cdot \cos \phi_2\right) \cdot 1\right) \cdot R\\
\end{array}
\end{array}
if phi1 < -1.45e13Initial program 82.3%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6454.5
Applied rewrites54.5%
if -1.45e13 < phi1 Initial program 72.0%
Taylor expanded in phi1 around 0
Applied rewrites44.3%
Taylor expanded in phi1 around 0
Applied rewrites49.8%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (cos (- lambda1 lambda2))))
(if (<= phi1 -14500000000000.0)
(* (acos (* t_0 (cos phi1))) R)
(* (acos (* t_0 (cos phi2))) R))))assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = cos((lambda1 - lambda2));
double tmp;
if (phi1 <= -14500000000000.0) {
tmp = acos((t_0 * cos(phi1))) * R;
} else {
tmp = acos((t_0 * cos(phi2))) * R;
}
return tmp;
}
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
real(8) function code(r, lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: r
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 (phi1 <= (-14500000000000.0d0)) then
tmp = acos((t_0 * cos(phi1))) * r
else
tmp = acos((t_0 * cos(phi2))) * r
end if
code = tmp
end function
assert R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2;
public static double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = Math.cos((lambda1 - lambda2));
double tmp;
if (phi1 <= -14500000000000.0) {
tmp = Math.acos((t_0 * Math.cos(phi1))) * R;
} else {
tmp = Math.acos((t_0 * Math.cos(phi2))) * R;
}
return tmp;
}
[R, lambda1, lambda2, phi1, phi2] = sort([R, lambda1, lambda2, phi1, phi2]) def code(R, lambda1, lambda2, phi1, phi2): t_0 = math.cos((lambda1 - lambda2)) tmp = 0 if phi1 <= -14500000000000.0: tmp = math.acos((t_0 * math.cos(phi1))) * R else: tmp = math.acos((t_0 * math.cos(phi2))) * R return tmp
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) t_0 = cos(Float64(lambda1 - lambda2)) tmp = 0.0 if (phi1 <= -14500000000000.0) tmp = Float64(acos(Float64(t_0 * cos(phi1))) * R); else tmp = Float64(acos(Float64(t_0 * cos(phi2))) * R); end return tmp end
R, lambda1, lambda2, phi1, phi2 = num2cell(sort([R, lambda1, lambda2, phi1, phi2])){:}
function tmp_2 = code(R, lambda1, lambda2, phi1, phi2)
t_0 = cos((lambda1 - lambda2));
tmp = 0.0;
if (phi1 <= -14500000000000.0)
tmp = acos((t_0 * cos(phi1))) * R;
else
tmp = acos((t_0 * cos(phi2))) * R;
end
tmp_2 = tmp;
end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
code[R_, lambda1_, lambda2_, phi1_, phi2_] := Block[{t$95$0 = N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]}, If[LessEqual[phi1, -14500000000000.0], N[(N[ArcCos[N[(t$95$0 * N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision], N[(N[ArcCos[N[(t$95$0 * N[Cos[phi2], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]]]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\begin{array}{l}
t_0 := \cos \left(\lambda_1 - \lambda_2\right)\\
\mathbf{if}\;\phi_1 \leq -14500000000000:\\
\;\;\;\;\cos^{-1} \left(t\_0 \cdot \cos \phi_1\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\cos^{-1} \left(t\_0 \cdot \cos \phi_2\right) \cdot R\\
\end{array}
\end{array}
if phi1 < -1.45e13Initial program 82.3%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6454.5
Applied rewrites54.5%
if -1.45e13 < phi1 Initial program 72.0%
Taylor expanded in phi1 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6450.2
Applied rewrites50.2%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function. (FPCore (R lambda1 lambda2 phi1 phi2) :precision binary64 (if (<= lambda2 8.8e-21) (* (acos (* (cos lambda1) (cos phi1))) R) (* (acos (* (cos lambda2) (cos phi1))) R)))
assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double tmp;
if (lambda2 <= 8.8e-21) {
tmp = acos((cos(lambda1) * cos(phi1))) * R;
} else {
tmp = acos((cos(lambda2) * cos(phi1))) * R;
}
return tmp;
}
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
real(8) function code(r, lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: r
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 <= 8.8d-21) then
tmp = acos((cos(lambda1) * cos(phi1))) * r
else
tmp = acos((cos(lambda2) * cos(phi1))) * r
end if
code = tmp
end function
assert R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2;
public static double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double tmp;
if (lambda2 <= 8.8e-21) {
tmp = Math.acos((Math.cos(lambda1) * Math.cos(phi1))) * R;
} else {
tmp = Math.acos((Math.cos(lambda2) * Math.cos(phi1))) * R;
}
return tmp;
}
[R, lambda1, lambda2, phi1, phi2] = sort([R, lambda1, lambda2, phi1, phi2]) def code(R, lambda1, lambda2, phi1, phi2): tmp = 0 if lambda2 <= 8.8e-21: tmp = math.acos((math.cos(lambda1) * math.cos(phi1))) * R else: tmp = math.acos((math.cos(lambda2) * math.cos(phi1))) * R return tmp
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) tmp = 0.0 if (lambda2 <= 8.8e-21) tmp = Float64(acos(Float64(cos(lambda1) * cos(phi1))) * R); else tmp = Float64(acos(Float64(cos(lambda2) * cos(phi1))) * R); end return tmp end
R, lambda1, lambda2, phi1, phi2 = num2cell(sort([R, lambda1, lambda2, phi1, phi2])){:}
function tmp_2 = code(R, lambda1, lambda2, phi1, phi2)
tmp = 0.0;
if (lambda2 <= 8.8e-21)
tmp = acos((cos(lambda1) * cos(phi1))) * R;
else
tmp = acos((cos(lambda2) * cos(phi1))) * R;
end
tmp_2 = tmp;
end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function. code[R_, lambda1_, lambda2_, phi1_, phi2_] := If[LessEqual[lambda2, 8.8e-21], N[(N[ArcCos[N[(N[Cos[lambda1], $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision], N[(N[ArcCos[N[(N[Cos[lambda2], $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\begin{array}{l}
\mathbf{if}\;\lambda_2 \leq 8.8 \cdot 10^{-21}:\\
\;\;\;\;\cos^{-1} \left(\cos \lambda_1 \cdot \cos \phi_1\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\cos^{-1} \left(\cos \lambda_2 \cdot \cos \phi_1\right) \cdot R\\
\end{array}
\end{array}
if lambda2 < 8.8000000000000002e-21Initial program 78.7%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6447.8
Applied rewrites47.8%
Taylor expanded in lambda2 around 0
Applied rewrites40.8%
if 8.8000000000000002e-21 < lambda2 Initial program 58.5%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6440.6
Applied rewrites40.6%
Taylor expanded in lambda1 around 0
Applied rewrites40.5%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(if (<= phi1 -0.00172)
(* (acos (* (cos lambda1) (cos phi1))) R)
(*
(fma
(PI)
0.5
(- (asin (* (fma -0.5 (* phi1 phi1) 1.0) (cos (- lambda2 lambda1))))))
R)))\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\begin{array}{l}
\mathbf{if}\;\phi_1 \leq -0.00172:\\
\;\;\;\;\cos^{-1} \left(\cos \lambda_1 \cdot \cos \phi_1\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\mathsf{PI}\left(\right), 0.5, -\sin^{-1} \left(\mathsf{fma}\left(-0.5, \phi_1 \cdot \phi_1, 1\right) \cdot \cos \left(\lambda_2 - \lambda_1\right)\right)\right) \cdot R\\
\end{array}
\end{array}
if phi1 < -0.00171999999999999996Initial program 82.8%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6453.4
Applied rewrites53.4%
Taylor expanded in lambda2 around 0
Applied rewrites48.1%
if -0.00171999999999999996 < phi1 Initial program 71.7%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6444.1
Applied rewrites44.1%
Taylor expanded in phi1 around 0
Applied rewrites25.2%
lift-acos.f64N/A
acos-asinN/A
sub-negN/A
div-invN/A
metadata-evalN/A
lower-fma.f64N/A
lower-PI.f64N/A
Applied rewrites25.2%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function. (FPCore (R lambda1 lambda2 phi1 phi2) :precision binary64 (* (acos (* (cos (- lambda1 lambda2)) (cos phi1))) R))
assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
return acos((cos((lambda1 - lambda2)) * cos(phi1))) * R;
}
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
real(8) function code(r, lambda1, lambda2, phi1, phi2)
real(8), intent (in) :: r
real(8), intent (in) :: lambda1
real(8), intent (in) :: lambda2
real(8), intent (in) :: phi1
real(8), intent (in) :: phi2
code = acos((cos((lambda1 - lambda2)) * cos(phi1))) * r
end function
assert R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2;
public static double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
return Math.acos((Math.cos((lambda1 - lambda2)) * Math.cos(phi1))) * R;
}
[R, lambda1, lambda2, phi1, phi2] = sort([R, lambda1, lambda2, phi1, phi2]) def code(R, lambda1, lambda2, phi1, phi2): return math.acos((math.cos((lambda1 - lambda2)) * math.cos(phi1))) * R
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) return Float64(acos(Float64(cos(Float64(lambda1 - lambda2)) * cos(phi1))) * R) end
R, lambda1, lambda2, phi1, phi2 = num2cell(sort([R, lambda1, lambda2, phi1, phi2])){:}
function tmp = code(R, lambda1, lambda2, phi1, phi2)
tmp = acos((cos((lambda1 - lambda2)) * cos(phi1))) * R;
end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function. code[R_, lambda1_, lambda2_, phi1_, phi2_] := N[(N[ArcCos[N[(N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision] * N[Cos[phi1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\cos^{-1} \left(\cos \left(\lambda_1 - \lambda_2\right) \cdot \cos \phi_1\right) \cdot R
\end{array}
Initial program 74.3%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6446.2
Applied rewrites46.2%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (cos (- lambda1 lambda2))))
(if (<= phi2 2.3)
(* (acos (* (fma (* phi2 phi2) -0.5 1.0) t_0)) R)
(* (acos (* (fma (* phi1 phi1) -0.5 1.0) t_0)) R))))assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = cos((lambda1 - lambda2));
double tmp;
if (phi2 <= 2.3) {
tmp = acos((fma((phi2 * phi2), -0.5, 1.0) * t_0)) * R;
} else {
tmp = acos((fma((phi1 * phi1), -0.5, 1.0) * t_0)) * R;
}
return tmp;
}
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) t_0 = cos(Float64(lambda1 - lambda2)) tmp = 0.0 if (phi2 <= 2.3) tmp = Float64(acos(Float64(fma(Float64(phi2 * phi2), -0.5, 1.0) * t_0)) * R); else tmp = Float64(acos(Float64(fma(Float64(phi1 * phi1), -0.5, 1.0) * t_0)) * R); end return tmp end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
code[R_, lambda1_, lambda2_, phi1_, phi2_] := Block[{t$95$0 = N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]}, If[LessEqual[phi2, 2.3], N[(N[ArcCos[N[(N[(N[(phi2 * phi2), $MachinePrecision] * -0.5 + 1.0), $MachinePrecision] * t$95$0), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision], N[(N[ArcCos[N[(N[(N[(phi1 * phi1), $MachinePrecision] * -0.5 + 1.0), $MachinePrecision] * t$95$0), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]]]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\begin{array}{l}
t_0 := \cos \left(\lambda_1 - \lambda_2\right)\\
\mathbf{if}\;\phi_2 \leq 2.3:\\
\;\;\;\;\cos^{-1} \left(\mathsf{fma}\left(\phi_2 \cdot \phi_2, -0.5, 1\right) \cdot t\_0\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\cos^{-1} \left(\mathsf{fma}\left(\phi_1 \cdot \phi_1, -0.5, 1\right) \cdot t\_0\right) \cdot R\\
\end{array}
\end{array}
if phi2 < 2.2999999999999998Initial program 73.2%
Taylor expanded in phi2 around 0
Applied rewrites50.3%
Taylor expanded in phi1 around 0
Applied rewrites25.6%
if 2.2999999999999998 < phi2 Initial program 77.8%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6418.6
Applied rewrites18.6%
Taylor expanded in phi1 around 0
Applied rewrites7.6%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (fma (* phi1 phi1) -0.5 1.0)))
(if (<= lambda2 3e-16)
(* (acos (* t_0 (cos lambda1))) R)
(* (acos (* t_0 (cos lambda2))) R))))assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = fma((phi1 * phi1), -0.5, 1.0);
double tmp;
if (lambda2 <= 3e-16) {
tmp = acos((t_0 * cos(lambda1))) * R;
} else {
tmp = acos((t_0 * cos(lambda2))) * R;
}
return tmp;
}
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) t_0 = fma(Float64(phi1 * phi1), -0.5, 1.0) tmp = 0.0 if (lambda2 <= 3e-16) tmp = Float64(acos(Float64(t_0 * cos(lambda1))) * R); else tmp = Float64(acos(Float64(t_0 * cos(lambda2))) * R); end return tmp end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function.
code[R_, lambda1_, lambda2_, phi1_, phi2_] := Block[{t$95$0 = N[(N[(phi1 * phi1), $MachinePrecision] * -0.5 + 1.0), $MachinePrecision]}, If[LessEqual[lambda2, 3e-16], N[(N[ArcCos[N[(t$95$0 * N[Cos[lambda1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision], N[(N[ArcCos[N[(t$95$0 * N[Cos[lambda2], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]]]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\begin{array}{l}
t_0 := \mathsf{fma}\left(\phi_1 \cdot \phi_1, -0.5, 1\right)\\
\mathbf{if}\;\lambda_2 \leq 3 \cdot 10^{-16}:\\
\;\;\;\;\cos^{-1} \left(t\_0 \cdot \cos \lambda_1\right) \cdot R\\
\mathbf{else}:\\
\;\;\;\;\cos^{-1} \left(t\_0 \cdot \cos \lambda_2\right) \cdot R\\
\end{array}
\end{array}
if lambda2 < 2.99999999999999994e-16Initial program 78.8%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6448.1
Applied rewrites48.1%
Taylor expanded in phi1 around 0
Applied rewrites18.6%
Taylor expanded in lambda1 around 0
Applied rewrites9.0%
Taylor expanded in lambda2 around 0
Applied rewrites14.6%
if 2.99999999999999994e-16 < lambda2 Initial program 57.7%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6439.5
Applied rewrites39.5%
Taylor expanded in phi1 around 0
Applied rewrites22.2%
Taylor expanded in lambda1 around 0
Applied rewrites22.2%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function. (FPCore (R lambda1 lambda2 phi1 phi2) :precision binary64 (* (acos (* (fma (* phi1 phi1) -0.5 1.0) (cos (- lambda1 lambda2)))) R))
assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
return acos((fma((phi1 * phi1), -0.5, 1.0) * cos((lambda1 - lambda2)))) * R;
}
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) return Float64(acos(Float64(fma(Float64(phi1 * phi1), -0.5, 1.0) * cos(Float64(lambda1 - lambda2)))) * R) end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function. code[R_, lambda1_, lambda2_, phi1_, phi2_] := N[(N[ArcCos[N[(N[(N[(phi1 * phi1), $MachinePrecision] * -0.5 + 1.0), $MachinePrecision] * N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\cos^{-1} \left(\mathsf{fma}\left(\phi_1 \cdot \phi_1, -0.5, 1\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)\right) \cdot R
\end{array}
Initial program 74.3%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6446.2
Applied rewrites46.2%
Taylor expanded in phi1 around 0
Applied rewrites19.4%
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function. (FPCore (R lambda1 lambda2 phi1 phi2) :precision binary64 (* (acos (* (fma (* phi1 phi1) -0.5 1.0) (cos lambda1))) R))
assert(R < lambda1 && lambda1 < lambda2 && lambda2 < phi1 && phi1 < phi2);
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
return acos((fma((phi1 * phi1), -0.5, 1.0) * cos(lambda1))) * R;
}
R, lambda1, lambda2, phi1, phi2 = sort([R, lambda1, lambda2, phi1, phi2]) function code(R, lambda1, lambda2, phi1, phi2) return Float64(acos(Float64(fma(Float64(phi1 * phi1), -0.5, 1.0) * cos(lambda1))) * R) end
NOTE: R, lambda1, lambda2, phi1, and phi2 should be sorted in increasing order before calling this function. code[R_, lambda1_, lambda2_, phi1_, phi2_] := N[(N[ArcCos[N[(N[(N[(phi1 * phi1), $MachinePrecision] * -0.5 + 1.0), $MachinePrecision] * N[Cos[lambda1], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]
\begin{array}{l}
[R, lambda1, lambda2, phi1, phi2] = \mathsf{sort}([R, lambda1, lambda2, phi1, phi2])\\
\\
\cos^{-1} \left(\mathsf{fma}\left(\phi_1 \cdot \phi_1, -0.5, 1\right) \cdot \cos \lambda_1\right) \cdot R
\end{array}
Initial program 74.3%
Taylor expanded in phi2 around 0
*-commutativeN/A
lower-*.f64N/A
sub-negN/A
+-commutativeN/A
remove-double-negN/A
mul-1-negN/A
distribute-neg-inN/A
lower-cos.f64N/A
+-commutativeN/A
distribute-neg-inN/A
mul-1-negN/A
remove-double-negN/A
sub-negN/A
lower--.f64N/A
lower-cos.f6446.2
Applied rewrites46.2%
Taylor expanded in phi1 around 0
Applied rewrites19.4%
Taylor expanded in lambda1 around 0
Applied rewrites11.9%
Taylor expanded in lambda2 around 0
Applied rewrites12.6%
herbie shell --seed 2024314
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Spherical law of cosines"
:precision binary64
(* (acos (+ (* (sin phi1) (sin phi2)) (* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2))))) R))