| Alternative 1 | |
|---|---|
| Error | 19.3 |
| Cost | 63304 |
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(*
R
(sqrt
(+
(*
(* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))
(* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))))
(* (- phi1 phi2) (- phi1 phi2))))))(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (cos (/ (+ phi1 phi2) 2.0)))
(t_1 (* (- phi1 phi2) (- phi1 phi2)))
(t_2 (* (- lambda1 lambda2) t_0))
(t_3 (* R (sqrt (+ (* t_2 t_2) t_1)))))
(if (<= t_3 (- INFINITY))
(- (* R phi2) (* R phi1))
(if (<= t_3 2e+307)
(*
R
(sqrt
(+
(*
(- lambda1 lambda2)
(* (- lambda1 lambda2) (* (* (* t_0 (/ 1.0 t_0)) t_0) t_0)))
t_1)))
(* R (- phi2 phi1))))))double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
return R * sqrt(((((lambda1 - lambda2) * cos(((phi1 + phi2) / 2.0))) * ((lambda1 - lambda2) * cos(((phi1 + phi2) / 2.0)))) + ((phi1 - phi2) * (phi1 - phi2))));
}
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = cos(((phi1 + phi2) / 2.0));
double t_1 = (phi1 - phi2) * (phi1 - phi2);
double t_2 = (lambda1 - lambda2) * t_0;
double t_3 = R * sqrt(((t_2 * t_2) + t_1));
double tmp;
if (t_3 <= -((double) INFINITY)) {
tmp = (R * phi2) - (R * phi1);
} else if (t_3 <= 2e+307) {
tmp = R * sqrt((((lambda1 - lambda2) * ((lambda1 - lambda2) * (((t_0 * (1.0 / t_0)) * t_0) * t_0))) + t_1));
} else {
tmp = R * (phi2 - phi1);
}
return tmp;
}
public static double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
return R * Math.sqrt(((((lambda1 - lambda2) * Math.cos(((phi1 + phi2) / 2.0))) * ((lambda1 - lambda2) * Math.cos(((phi1 + phi2) / 2.0)))) + ((phi1 - phi2) * (phi1 - phi2))));
}
public static double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = Math.cos(((phi1 + phi2) / 2.0));
double t_1 = (phi1 - phi2) * (phi1 - phi2);
double t_2 = (lambda1 - lambda2) * t_0;
double t_3 = R * Math.sqrt(((t_2 * t_2) + t_1));
double tmp;
if (t_3 <= -Double.POSITIVE_INFINITY) {
tmp = (R * phi2) - (R * phi1);
} else if (t_3 <= 2e+307) {
tmp = R * Math.sqrt((((lambda1 - lambda2) * ((lambda1 - lambda2) * (((t_0 * (1.0 / t_0)) * t_0) * t_0))) + t_1));
} else {
tmp = R * (phi2 - phi1);
}
return tmp;
}
def code(R, lambda1, lambda2, phi1, phi2): return R * math.sqrt(((((lambda1 - lambda2) * math.cos(((phi1 + phi2) / 2.0))) * ((lambda1 - lambda2) * math.cos(((phi1 + phi2) / 2.0)))) + ((phi1 - phi2) * (phi1 - phi2))))
def code(R, lambda1, lambda2, phi1, phi2): t_0 = math.cos(((phi1 + phi2) / 2.0)) t_1 = (phi1 - phi2) * (phi1 - phi2) t_2 = (lambda1 - lambda2) * t_0 t_3 = R * math.sqrt(((t_2 * t_2) + t_1)) tmp = 0 if t_3 <= -math.inf: tmp = (R * phi2) - (R * phi1) elif t_3 <= 2e+307: tmp = R * math.sqrt((((lambda1 - lambda2) * ((lambda1 - lambda2) * (((t_0 * (1.0 / t_0)) * t_0) * t_0))) + t_1)) else: tmp = R * (phi2 - phi1) return tmp
function code(R, lambda1, lambda2, phi1, phi2) return Float64(R * sqrt(Float64(Float64(Float64(Float64(lambda1 - lambda2) * cos(Float64(Float64(phi1 + phi2) / 2.0))) * Float64(Float64(lambda1 - lambda2) * cos(Float64(Float64(phi1 + phi2) / 2.0)))) + Float64(Float64(phi1 - phi2) * Float64(phi1 - phi2))))) end
function code(R, lambda1, lambda2, phi1, phi2) t_0 = cos(Float64(Float64(phi1 + phi2) / 2.0)) t_1 = Float64(Float64(phi1 - phi2) * Float64(phi1 - phi2)) t_2 = Float64(Float64(lambda1 - lambda2) * t_0) t_3 = Float64(R * sqrt(Float64(Float64(t_2 * t_2) + t_1))) tmp = 0.0 if (t_3 <= Float64(-Inf)) tmp = Float64(Float64(R * phi2) - Float64(R * phi1)); elseif (t_3 <= 2e+307) tmp = Float64(R * sqrt(Float64(Float64(Float64(lambda1 - lambda2) * Float64(Float64(lambda1 - lambda2) * Float64(Float64(Float64(t_0 * Float64(1.0 / t_0)) * t_0) * t_0))) + t_1))); else tmp = Float64(R * Float64(phi2 - phi1)); end return tmp end
function tmp = code(R, lambda1, lambda2, phi1, phi2) tmp = R * sqrt(((((lambda1 - lambda2) * cos(((phi1 + phi2) / 2.0))) * ((lambda1 - lambda2) * cos(((phi1 + phi2) / 2.0)))) + ((phi1 - phi2) * (phi1 - phi2)))); end
function tmp_2 = code(R, lambda1, lambda2, phi1, phi2) t_0 = cos(((phi1 + phi2) / 2.0)); t_1 = (phi1 - phi2) * (phi1 - phi2); t_2 = (lambda1 - lambda2) * t_0; t_3 = R * sqrt(((t_2 * t_2) + t_1)); tmp = 0.0; if (t_3 <= -Inf) tmp = (R * phi2) - (R * phi1); elseif (t_3 <= 2e+307) tmp = R * sqrt((((lambda1 - lambda2) * ((lambda1 - lambda2) * (((t_0 * (1.0 / t_0)) * t_0) * t_0))) + t_1)); else tmp = R * (phi2 - phi1); end tmp_2 = tmp; end
code[R_, lambda1_, lambda2_, phi1_, phi2_] := N[(R * N[Sqrt[N[(N[(N[(N[(lambda1 - lambda2), $MachinePrecision] * N[Cos[N[(N[(phi1 + phi2), $MachinePrecision] / 2.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] * N[(N[(lambda1 - lambda2), $MachinePrecision] * N[Cos[N[(N[(phi1 + phi2), $MachinePrecision] / 2.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(N[(phi1 - phi2), $MachinePrecision] * N[(phi1 - phi2), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
code[R_, lambda1_, lambda2_, phi1_, phi2_] := Block[{t$95$0 = N[Cos[N[(N[(phi1 + phi2), $MachinePrecision] / 2.0), $MachinePrecision]], $MachinePrecision]}, Block[{t$95$1 = N[(N[(phi1 - phi2), $MachinePrecision] * N[(phi1 - phi2), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$2 = N[(N[(lambda1 - lambda2), $MachinePrecision] * t$95$0), $MachinePrecision]}, Block[{t$95$3 = N[(R * N[Sqrt[N[(N[(t$95$2 * t$95$2), $MachinePrecision] + t$95$1), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[t$95$3, (-Infinity)], N[(N[(R * phi2), $MachinePrecision] - N[(R * phi1), $MachinePrecision]), $MachinePrecision], If[LessEqual[t$95$3, 2e+307], N[(R * N[Sqrt[N[(N[(N[(lambda1 - lambda2), $MachinePrecision] * N[(N[(lambda1 - lambda2), $MachinePrecision] * N[(N[(N[(t$95$0 * N[(1.0 / t$95$0), $MachinePrecision]), $MachinePrecision] * t$95$0), $MachinePrecision] * t$95$0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + t$95$1), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(R * N[(phi2 - phi1), $MachinePrecision]), $MachinePrecision]]]]]]]
R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}
\begin{array}{l}
t_0 := \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\\
t_1 := \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)\\
t_2 := \left(\lambda_1 - \lambda_2\right) \cdot t_0\\
t_3 := R \cdot \sqrt{t_2 \cdot t_2 + t_1}\\
\mathbf{if}\;t_3 \leq -\infty:\\
\;\;\;\;R \cdot \phi_2 - R \cdot \phi_1\\
\mathbf{elif}\;t_3 \leq 2 \cdot 10^{+307}:\\
\;\;\;\;R \cdot \sqrt{\left(\lambda_1 - \lambda_2\right) \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\left(\left(t_0 \cdot \frac{1}{t_0}\right) \cdot t_0\right) \cdot t_0\right)\right) + t_1}\\
\mathbf{else}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\end{array}
Results
if (*.f64 R (sqrt.f64 (+.f64 (*.f64 (*.f64 (-.f64 lambda1 lambda2) (cos.f64 (/.f64 (+.f64 phi1 phi2) 2))) (*.f64 (-.f64 lambda1 lambda2) (cos.f64 (/.f64 (+.f64 phi1 phi2) 2)))) (*.f64 (-.f64 phi1 phi2) (-.f64 phi1 phi2))))) < -inf.0Initial program 64.0
Taylor expanded in phi1 around -inf 30.8
Simplified30.8
[Start]30.8 | \[ R \cdot \left(-1 \cdot \phi_1 + \phi_2\right)
\] |
|---|---|
rational_best_oopsla_all_46_json_45_simplify-35 [=>]30.8 | \[ R \cdot \color{blue}{\left(\phi_2 + -1 \cdot \phi_1\right)}
\] |
rational_best_oopsla_all_46_json_45_simplify-74 [=>]30.8 | \[ R \cdot \left(\phi_2 + \color{blue}{\phi_1 \cdot -1}\right)
\] |
rational_best_oopsla_all_46_json_45_simplify-92 [=>]30.8 | \[ R \cdot \left(\phi_2 + \color{blue}{\left(-\phi_1\right)}\right)
\] |
Applied egg-rr30.8
if -inf.0 < (*.f64 R (sqrt.f64 (+.f64 (*.f64 (*.f64 (-.f64 lambda1 lambda2) (cos.f64 (/.f64 (+.f64 phi1 phi2) 2))) (*.f64 (-.f64 lambda1 lambda2) (cos.f64 (/.f64 (+.f64 phi1 phi2) 2)))) (*.f64 (-.f64 phi1 phi2) (-.f64 phi1 phi2))))) < 1.99999999999999997e307Initial program 2.0
Simplified2.0
[Start]2.0 | \[ R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}
\] |
|---|---|
rational_best_oopsla_all_46_json_45_simplify-7 [=>]2.0 | \[ R \cdot \sqrt{\color{blue}{\left(\lambda_1 - \lambda_2\right) \cdot \left(\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)} + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}
\] |
rational_best_oopsla_all_46_json_45_simplify-74 [=>]2.0 | \[ R \cdot \sqrt{\left(\lambda_1 - \lambda_2\right) \cdot \color{blue}{\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right) \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)\right)} + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}
\] |
rational_best_oopsla_all_46_json_45_simplify-7 [=>]2.0 | \[ R \cdot \sqrt{\left(\lambda_1 - \lambda_2\right) \cdot \color{blue}{\left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)\right)} + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}
\] |
Applied egg-rr2.0
if 1.99999999999999997e307 < (*.f64 R (sqrt.f64 (+.f64 (*.f64 (*.f64 (-.f64 lambda1 lambda2) (cos.f64 (/.f64 (+.f64 phi1 phi2) 2))) (*.f64 (-.f64 lambda1 lambda2) (cos.f64 (/.f64 (+.f64 phi1 phi2) 2)))) (*.f64 (-.f64 phi1 phi2) (-.f64 phi1 phi2))))) Initial program 64.0
Taylor expanded in phi1 around -inf 31.0
Simplified31.0
[Start]31.0 | \[ R \cdot \left(-1 \cdot \phi_1 + \phi_2\right)
\] |
|---|---|
rational_best_oopsla_all_46_json_45_simplify-35 [=>]31.0 | \[ R \cdot \color{blue}{\left(\phi_2 + -1 \cdot \phi_1\right)}
\] |
rational_best_oopsla_all_46_json_45_simplify-74 [=>]31.0 | \[ R \cdot \left(\phi_2 + \color{blue}{\phi_1 \cdot -1}\right)
\] |
rational_best_oopsla_all_46_json_45_simplify-92 [=>]31.0 | \[ R \cdot \left(\phi_2 + \color{blue}{\left(-\phi_1\right)}\right)
\] |
Taylor expanded in R around 0 31.0
Final simplification19.3
| Alternative 1 | |
|---|---|
| Error | 19.3 |
| Cost | 63304 |
| Alternative 2 | |
|---|---|
| Error | 27.9 |
| Cost | 21388 |
| Alternative 3 | |
|---|---|
| Error | 28.0 |
| Cost | 8268 |
| Alternative 4 | |
|---|---|
| Error | 28.2 |
| Cost | 7820 |
| Alternative 5 | |
|---|---|
| Error | 32.4 |
| Cost | 7568 |
| Alternative 6 | |
|---|---|
| Error | 30.9 |
| Cost | 7568 |
| Alternative 7 | |
|---|---|
| Error | 32.5 |
| Cost | 7376 |
| Alternative 8 | |
|---|---|
| Error | 32.3 |
| Cost | 7376 |
| Alternative 9 | |
|---|---|
| Error | 34.2 |
| Cost | 7240 |
| Alternative 10 | |
|---|---|
| Error | 29.2 |
| Cost | 7108 |
| Alternative 11 | |
|---|---|
| Error | 29.5 |
| Cost | 6980 |
| Alternative 12 | |
|---|---|
| Error | 30.4 |
| Cost | 448 |
| Alternative 13 | |
|---|---|
| Error | 34.9 |
| Cost | 388 |
| Alternative 14 | |
|---|---|
| Error | 30.4 |
| Cost | 320 |
| Alternative 15 | |
|---|---|
| Error | 57.3 |
| Cost | 192 |
| Alternative 16 | |
|---|---|
| Error | 46.6 |
| Cost | 192 |
herbie shell --seed 2023090
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
:precision binary64
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))))