| Alternative 1 | |
|---|---|
| Error | 3.9 |
| Cost | 104004 |
(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(*
(acos
(+
(* (sin phi1) (sin phi2))
(* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2)))))
R))(FPCore (R lambda1 lambda2 phi1 phi2)
:precision binary64
(let* ((t_0 (* (sin lambda1) (sin lambda2)))
(t_1 (* (sin phi1) (sin phi2)))
(t_2
(*
(acos
(+ t_1 (* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2)))))
R)))
(if (<= t_2 -2e-306)
(*
R
(acos
(fma
(sin phi1)
(sin phi2)
(*
(cos phi2)
(*
(cos phi1)
(+ (expm1 (log1p t_0)) (* (cos lambda1) (cos lambda2))))))))
(if (<= t_2 0.0)
(* R (fabs (remainder (- lambda2 lambda1) (* 2.0 PI))))
(*
R
(acos
(fma
(cos phi2)
(* (cos phi1) (fma (cos lambda2) (cos lambda1) t_0))
t_1)))))))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;
}
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double t_0 = sin(lambda1) * sin(lambda2);
double t_1 = sin(phi1) * sin(phi2);
double t_2 = acos((t_1 + ((cos(phi1) * cos(phi2)) * cos((lambda1 - lambda2))))) * R;
double tmp;
if (t_2 <= -2e-306) {
tmp = R * acos(fma(sin(phi1), sin(phi2), (cos(phi2) * (cos(phi1) * (expm1(log1p(t_0)) + (cos(lambda1) * cos(lambda2)))))));
} else if (t_2 <= 0.0) {
tmp = R * fabs(remainder((lambda2 - lambda1), (2.0 * ((double) M_PI))));
} else {
tmp = R * acos(fma(cos(phi2), (cos(phi1) * fma(cos(lambda2), cos(lambda1), t_0)), t_1));
}
return tmp;
}
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]
code[R_, lambda1_, lambda2_, phi1_, phi2_] := Block[{t$95$0 = N[(N[Sin[lambda1], $MachinePrecision] * N[Sin[lambda2], $MachinePrecision]), $MachinePrecision]}, Block[{t$95$1 = N[(N[Sin[phi1], $MachinePrecision] * N[Sin[phi2], $MachinePrecision]), $MachinePrecision]}, Block[{t$95$2 = N[(N[ArcCos[N[(t$95$1 + N[(N[(N[Cos[phi1], $MachinePrecision] * N[Cos[phi2], $MachinePrecision]), $MachinePrecision] * N[Cos[N[(lambda1 - lambda2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * R), $MachinePrecision]}, If[LessEqual[t$95$2, -2e-306], N[(R * N[ArcCos[N[(N[Sin[phi1], $MachinePrecision] * N[Sin[phi2], $MachinePrecision] + N[(N[Cos[phi2], $MachinePrecision] * N[(N[Cos[phi1], $MachinePrecision] * N[(N[(Exp[N[Log[1 + t$95$0], $MachinePrecision]] - 1), $MachinePrecision] + N[(N[Cos[lambda1], $MachinePrecision] * N[Cos[lambda2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], If[LessEqual[t$95$2, 0.0], N[(R * N[Abs[N[With[{TMP1 = N[(lambda2 - lambda1), $MachinePrecision], TMP2 = N[(2.0 * Pi), $MachinePrecision]}, TMP1 - Round[TMP1 / TMP2] * TMP2], $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(R * N[ArcCos[N[(N[Cos[phi2], $MachinePrecision] * N[(N[Cos[phi1], $MachinePrecision] * N[(N[Cos[lambda2], $MachinePrecision] * N[Cos[lambda1], $MachinePrecision] + t$95$0), $MachinePrecision]), $MachinePrecision] + t$95$1), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]]]]
\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
\begin{array}{l}
t_0 := \sin \lambda_1 \cdot \sin \lambda_2\\
t_1 := \sin \phi_1 \cdot \sin \phi_2\\
t_2 := \cos^{-1} \left(t_1 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)\right) \cdot R\\
\mathbf{if}\;t_2 \leq -2 \cdot 10^{-306}:\\
\;\;\;\;R \cdot \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \cos \phi_2 \cdot \left(\cos \phi_1 \cdot \left(\mathsf{expm1}\left(\mathsf{log1p}\left(t_0\right)\right) + \cos \lambda_1 \cdot \cos \lambda_2\right)\right)\right)\right)\\
\mathbf{elif}\;t_2 \leq 0:\\
\;\;\;\;R \cdot \left|\left(\left(\lambda_2 - \lambda_1\right) \mathsf{rem} \left(2 \cdot \pi\right)\right)\right|\\
\mathbf{else}:\\
\;\;\;\;R \cdot \cos^{-1} \left(\mathsf{fma}\left(\cos \phi_2, \cos \phi_1 \cdot \mathsf{fma}\left(\cos \lambda_2, \cos \lambda_1, t_0\right), t_1\right)\right)\\
\end{array}
if (*.f64 (acos.f64 (+.f64 (*.f64 (sin.f64 phi1) (sin.f64 phi2)) (*.f64 (*.f64 (cos.f64 phi1) (cos.f64 phi2)) (cos.f64 (-.f64 lambda1 lambda2))))) R) < -2.00000000000000006e-306Initial program 14.2
Simplified14.2
[Start]14.2 | \[ \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
\] |
|---|---|
fma-def [=>]14.2 | \[ \cos^{-1} \color{blue}{\left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)\right)\right)} \cdot R
\] |
*-commutative [=>]14.2 | \[ \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \color{blue}{\left(\cos \phi_2 \cdot \cos \phi_1\right)} \cdot \cos \left(\lambda_1 - \lambda_2\right)\right)\right) \cdot R
\] |
associate-*l* [=>]14.2 | \[ \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \color{blue}{\cos \phi_2 \cdot \left(\cos \phi_1 \cdot \cos \left(\lambda_1 - \lambda_2\right)\right)}\right)\right) \cdot R
\] |
Applied egg-rr0.8
Applied egg-rr0.8
if -2.00000000000000006e-306 < (*.f64 (acos.f64 (+.f64 (*.f64 (sin.f64 phi1) (sin.f64 phi2)) (*.f64 (*.f64 (cos.f64 phi1) (cos.f64 phi2)) (cos.f64 (-.f64 lambda1 lambda2))))) R) < -0.0Initial program 53.0
Simplified53.0
[Start]53.0 | \[ \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
\] |
|---|---|
fma-def [=>]53.0 | \[ \cos^{-1} \color{blue}{\left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)\right)\right)} \cdot R
\] |
*-commutative [=>]53.0 | \[ \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \color{blue}{\left(\cos \phi_2 \cdot \cos \phi_1\right)} \cdot \cos \left(\lambda_1 - \lambda_2\right)\right)\right) \cdot R
\] |
associate-*l* [=>]53.0 | \[ \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \color{blue}{\cos \phi_2 \cdot \left(\cos \phi_1 \cdot \cos \left(\lambda_1 - \lambda_2\right)\right)}\right)\right) \cdot R
\] |
Taylor expanded in phi2 around 0 54.2
Taylor expanded in phi1 around 0 54.3
Simplified54.3
[Start]54.3 | \[ \cos^{-1} \cos \left(\lambda_1 - \lambda_2\right) \cdot R
\] |
|---|---|
sub-neg [=>]54.3 | \[ \cos^{-1} \cos \color{blue}{\left(\lambda_1 + \left(-\lambda_2\right)\right)} \cdot R
\] |
remove-double-neg [<=]54.3 | \[ \cos^{-1} \cos \left(\color{blue}{\left(-\left(-\lambda_1\right)\right)} + \left(-\lambda_2\right)\right) \cdot R
\] |
mul-1-neg [<=]54.3 | \[ \cos^{-1} \cos \left(\left(-\color{blue}{-1 \cdot \lambda_1}\right) + \left(-\lambda_2\right)\right) \cdot R
\] |
distribute-neg-in [<=]54.3 | \[ \cos^{-1} \cos \color{blue}{\left(-\left(-1 \cdot \lambda_1 + \lambda_2\right)\right)} \cdot R
\] |
cos-neg [=>]54.3 | \[ \cos^{-1} \color{blue}{\cos \left(-1 \cdot \lambda_1 + \lambda_2\right)} \cdot R
\] |
+-commutative [=>]54.3 | \[ \cos^{-1} \cos \color{blue}{\left(\lambda_2 + -1 \cdot \lambda_1\right)} \cdot R
\] |
mul-1-neg [=>]54.3 | \[ \cos^{-1} \cos \left(\lambda_2 + \color{blue}{\left(-\lambda_1\right)}\right) \cdot R
\] |
unsub-neg [=>]54.3 | \[ \cos^{-1} \cos \color{blue}{\left(\lambda_2 - \lambda_1\right)} \cdot R
\] |
Applied egg-rr29.0
if -0.0 < (*.f64 (acos.f64 (+.f64 (*.f64 (sin.f64 phi1) (sin.f64 phi2)) (*.f64 (*.f64 (cos.f64 phi1) (cos.f64 phi2)) (cos.f64 (-.f64 lambda1 lambda2))))) R) Initial program 14.1
Simplified14.1
[Start]14.1 | \[ \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
\] |
|---|---|
fma-def [=>]14.1 | \[ \cos^{-1} \color{blue}{\left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)\right)\right)} \cdot R
\] |
*-commutative [=>]14.1 | \[ \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \color{blue}{\left(\cos \phi_2 \cdot \cos \phi_1\right)} \cdot \cos \left(\lambda_1 - \lambda_2\right)\right)\right) \cdot R
\] |
associate-*l* [=>]14.1 | \[ \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \color{blue}{\cos \phi_2 \cdot \left(\cos \phi_1 \cdot \cos \left(\lambda_1 - \lambda_2\right)\right)}\right)\right) \cdot R
\] |
Applied egg-rr0.7
Taylor expanded in phi1 around 0 0.7
Simplified0.7
[Start]0.7 | \[ \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \cos \phi_2 \cdot \left(\cos \phi_1 \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \sin \lambda_2 \cdot \sin \lambda_1\right)\right)\right)\right) \cdot R
\] |
|---|---|
fma-udef [=>]0.8 | \[ \cos^{-1} \color{blue}{\left(\sin \phi_1 \cdot \sin \phi_2 + \cos \phi_2 \cdot \left(\cos \phi_1 \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \sin \lambda_2 \cdot \sin \lambda_1\right)\right)\right)} \cdot R
\] |
+-commutative [<=]0.8 | \[ \cos^{-1} \color{blue}{\left(\cos \phi_2 \cdot \left(\cos \phi_1 \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \sin \lambda_2 \cdot \sin \lambda_1\right)\right) + \sin \phi_1 \cdot \sin \phi_2\right)} \cdot R
\] |
fma-def [=>]0.7 | \[ \cos^{-1} \color{blue}{\left(\mathsf{fma}\left(\cos \phi_2, \cos \phi_1 \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \sin \lambda_2 \cdot \sin \lambda_1\right), \sin \phi_1 \cdot \sin \phi_2\right)\right)} \cdot R
\] |
*-commutative [<=]0.7 | \[ \cos^{-1} \left(\mathsf{fma}\left(\cos \phi_2, \cos \phi_1 \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \color{blue}{\sin \lambda_1 \cdot \sin \lambda_2}\right), \sin \phi_1 \cdot \sin \phi_2\right)\right) \cdot R
\] |
fma-def [=>]0.7 | \[ \cos^{-1} \left(\mathsf{fma}\left(\cos \phi_2, \cos \phi_1 \cdot \color{blue}{\mathsf{fma}\left(\cos \lambda_2, \cos \lambda_1, \sin \lambda_1 \cdot \sin \lambda_2\right)}, \sin \phi_1 \cdot \sin \phi_2\right)\right) \cdot R
\] |
*-commutative [=>]0.7 | \[ \cos^{-1} \left(\mathsf{fma}\left(\cos \phi_2, \cos \phi_1 \cdot \mathsf{fma}\left(\cos \lambda_2, \cos \lambda_1, \color{blue}{\sin \lambda_2 \cdot \sin \lambda_1}\right), \sin \phi_1 \cdot \sin \phi_2\right)\right) \cdot R
\] |
Final simplification2.5
| Alternative 1 | |
|---|---|
| Error | 3.9 |
| Cost | 104004 |
| Alternative 2 | |
|---|---|
| Error | 3.9 |
| Cost | 97732 |
| Alternative 3 | |
|---|---|
| Error | 3.9 |
| Cost | 91460 |
| Alternative 4 | |
|---|---|
| Error | 10.2 |
| Cost | 52296 |
| Alternative 5 | |
|---|---|
| Error | 10.2 |
| Cost | 52296 |
| Alternative 6 | |
|---|---|
| Error | 10.2 |
| Cost | 46024 |
| Alternative 7 | |
|---|---|
| Error | 10.3 |
| Cost | 45636 |
| Alternative 8 | |
|---|---|
| Error | 17.3 |
| Cost | 39633 |
| Alternative 9 | |
|---|---|
| Error | 16.8 |
| Cost | 39500 |
| Alternative 10 | |
|---|---|
| Error | 10.3 |
| Cost | 39497 |
| Alternative 11 | |
|---|---|
| Error | 21.2 |
| Cost | 39368 |
| Alternative 12 | |
|---|---|
| Error | 16.7 |
| Cost | 39368 |
| Alternative 13 | |
|---|---|
| Error | 26.0 |
| Cost | 32712 |
| Alternative 14 | |
|---|---|
| Error | 26.9 |
| Cost | 32580 |
| Alternative 15 | |
|---|---|
| Error | 30.0 |
| Cost | 19780 |
| Alternative 16 | |
|---|---|
| Error | 26.9 |
| Cost | 19780 |
| Alternative 17 | |
|---|---|
| Error | 42.3 |
| Cost | 19652 |
| Alternative 18 | |
|---|---|
| Error | 40.3 |
| Cost | 19652 |
| Alternative 19 | |
|---|---|
| Error | 40.5 |
| Cost | 19652 |
| Alternative 20 | |
|---|---|
| Error | 50.7 |
| Cost | 13384 |
| Alternative 21 | |
|---|---|
| Error | 50.9 |
| Cost | 13256 |
| Alternative 22 | |
|---|---|
| Error | 56.7 |
| Cost | 13124 |
| Alternative 23 | |
|---|---|
| Error | 60.7 |
| Cost | 320 |
| Alternative 24 | |
|---|---|
| Error | 60.8 |
| Cost | 192 |
herbie shell --seed 2023073
(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))