Average Error: 16.8 → 3.8
Time: 54.8s
Precision: 64
Internal Precision: 128
\[\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\]
\[\log_* (1 + (e^{\cos^{-1} \left((\left((\left(\sin \lambda_2\right) \cdot \left(\sin \lambda_1\right) + \left(\cos \lambda_1 \cdot \cos \lambda_2\right))_*\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right) + \left(\sin \phi_2 \cdot \sin \phi_1\right))_*\right)} - 1)^*) \cdot R\]

Error

Bits error versus R

Bits error versus lambda1

Bits error versus lambda2

Bits error versus phi1

Bits error versus phi2

Derivation

  1. Initial program 16.8

    \[\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\]
  2. Using strategy rm
  3. Applied cos-diff3.8

    \[\leadsto \cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \color{blue}{\left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right)}\right) \cdot R\]
  4. Applied distribute-rgt-in3.8

    \[\leadsto \cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \color{blue}{\left(\left(\cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right) + \left(\sin \lambda_1 \cdot \sin \lambda_2\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right)\right)}\right) \cdot R\]
  5. Taylor expanded around -inf 3.8

    \[\leadsto \color{blue}{\cos^{-1} \left(\cos \phi_1 \cdot \left(\cos \phi_2 \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)\right) + \left(\cos \phi_1 \cdot \left(\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2\right)\right) + \sin \phi_1 \cdot \sin \phi_2\right)\right)} \cdot R\]
  6. Simplified3.8

    \[\leadsto \color{blue}{\cos^{-1} \left((\left((\left(\sin \lambda_2\right) \cdot \left(\sin \lambda_1\right) + \left(\cos \lambda_1 \cdot \cos \lambda_2\right))_*\right) \cdot \left(\cos \phi_2 \cdot \cos \phi_1\right) + \left(\sin \phi_1 \cdot \sin \phi_2\right))_*\right)} \cdot R\]
  7. Using strategy rm
  8. Applied log1p-expm1-u3.8

    \[\leadsto \color{blue}{\log_* (1 + (e^{\cos^{-1} \left((\left((\left(\sin \lambda_2\right) \cdot \left(\sin \lambda_1\right) + \left(\cos \lambda_1 \cdot \cos \lambda_2\right))_*\right) \cdot \left(\cos \phi_2 \cdot \cos \phi_1\right) + \left(\sin \phi_1 \cdot \sin \phi_2\right))_*\right)} - 1)^*)} \cdot R\]
  9. Final simplification3.8

    \[\leadsto \log_* (1 + (e^{\cos^{-1} \left((\left((\left(\sin \lambda_2\right) \cdot \left(\sin \lambda_1\right) + \left(\cos \lambda_1 \cdot \cos \lambda_2\right))_*\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right) + \left(\sin \phi_2 \cdot \sin \phi_1\right))_*\right)} - 1)^*) \cdot R\]

Reproduce

herbie shell --seed 2019010 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
  :name "Spherical law of cosines"
  (* (acos (+ (* (sin phi1) (sin phi2)) (* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2))))) R))

Details

Time bar (total: 48.3s)Debug log

sample999.0ms

Algorithm
intervals

simplify98.0ms

Counts
1 → 1
Calls
1 calls:
Slowest
97.0ms
(* (acos (+ (* (sin phi1) (sin phi2)) (* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2))))) R)

prune40.0ms

Pruning

1 alts after pruning (1 fresh and 0 done)

Merged error: 15.0b

localize106.0ms

Local error

Found 4 expressions with local error:

2.5b
(cos (- lambda1 lambda2))
0.3b
(acos (+ (* (sin phi1) (sin phi2)) (* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2)))))
0.3b
(* (acos (+ (* (sin phi1) (sin phi2)) (* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2))))) R)
0.2b
(* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2)))

rewrite42.0ms

Algorithm
rewrite-expression-head
Rules
add-exp-log
add-cbrt-cube
pow1
add-cube-cbrt
*-un-lft-identity
add-sqr-sqrt
add-log-exp
log1p-expm1-u
associate-*l*
expm1-log1p-u
cbrt-unprod
prod-exp
pow-prod-down
associate-*r*
cos-diff
*-commutative
cos-sum
cos-mult
associate-*l/
distribute-lft-in
sub-neg
acos-asin
distribute-rgt-in
Counts
4 → 58
Calls
4 calls:
Slowest
24.0ms
(* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2)))
6.0ms
(cos (- lambda1 lambda2))
5.0ms
(* (acos (+ (* (sin phi1) (sin phi2)) (* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2))))) R)
2.0ms
(acos (+ (* (sin phi1) (sin phi2)) (* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2)))))

series251.0ms

Counts
4 → 12
Calls
4 calls:
Slowest
141.0ms
(* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2)))
54.0ms
(* (acos (+ (* (sin phi1) (sin phi2)) (* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2))))) R)
34.0ms
(cos (- lambda1 lambda2))
20.0ms
(acos (+ (* (sin phi1) (sin phi2)) (* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2)))))

simplify1.2s

Counts
30 → 70
Calls
30 calls:
Slowest
276.0ms
(* (* (* (* (cos phi1) (cos phi1)) (cos phi1)) (* (* (cos phi2) (cos phi2)) (cos phi2))) (* (* (cos (- lambda1 lambda2)) (cos (- lambda1 lambda2))) (cos (- lambda1 lambda2))))
203.0ms
(* (* (* (* (cos phi1) (cos phi2)) (* (cos phi1) (cos phi2))) (* (cos phi1) (cos phi2))) (* (* (cos (- lambda1 lambda2)) (cos (- lambda1 lambda2))) (cos (- lambda1 lambda2))))
190.0ms
(- 1 (+ (* 1/2 (pow phi2 2)) (* 1/2 (pow phi1 2))))
85.0ms
(- (+ 1 (* lambda2 lambda1)) (* 1/2 (pow lambda1 2)))
54.0ms
(* (* (cos phi1) (cos phi2)) (* (sin lambda1) (sin lambda2)))

prune1.6s

Pruning

15 alts after pruning (15 fresh and 0 done)

Merged error: 2.7b

localize69.0ms

Local error

Found 4 expressions with local error:

0.4b
(acos (+ (* (sin phi1) (sin phi2)) (+ (* (* (cos lambda1) (cos lambda2)) (* (cos phi1) (cos phi2))) (* (* (sin lambda1) (sin lambda2)) (* (cos phi1) (cos phi2))))))
0.3b
(* (acos (+ (* (sin phi1) (sin phi2)) (+ (* (* (cos lambda1) (cos lambda2)) (* (cos phi1) (cos phi2))) (* (* (sin lambda1) (sin lambda2)) (* (cos phi1) (cos phi2)))))) R)
0.3b
(* (sin lambda1) (sin lambda2))
0.2b
(* (* (cos lambda1) (cos lambda2)) (* (cos phi1) (cos phi2)))

rewrite56.0ms

Algorithm
rewrite-expression-head
Rules
18×add-exp-log
18×add-cbrt-cube
18×pow1
cbrt-unprod
prod-exp
pow-prod-down
add-cube-cbrt
associate-*l*
*-un-lft-identity
add-sqr-sqrt
add-log-exp
log1p-expm1-u
cos-mult
associate-*r*
expm1-log1p-u
*-commutative
sin-mult
associate-*r/
associate-*l/
frac-times
acos-asin
Counts
4 → 70
Calls
4 calls:
Slowest
33.0ms
(* (* (cos lambda1) (cos lambda2)) (* (cos phi1) (cos phi2)))
11.0ms
(* (acos (+ (* (sin phi1) (sin phi2)) (+ (* (* (cos lambda1) (cos lambda2)) (* (cos phi1) (cos phi2))) (* (* (sin lambda1) (sin lambda2)) (* (cos phi1) (cos phi2)))))) R)
8.0ms
(* (sin lambda1) (sin lambda2))
2.0ms
(acos (+ (* (sin phi1) (sin phi2)) (+ (* (* (cos lambda1) (cos lambda2)) (* (cos phi1) (cos phi2))) (* (* (sin lambda1) (sin lambda2)) (* (cos phi1) (cos phi2))))))

series315.0ms

Counts
4 → 12
Calls
4 calls:
Slowest
142.0ms
(* (* (cos lambda1) (cos lambda2)) (* (cos phi1) (cos phi2)))
78.0ms
(* (sin lambda1) (sin lambda2))
70.0ms
(* (acos (+ (* (sin phi1) (sin phi2)) (+ (* (* (cos lambda1) (cos lambda2)) (* (cos phi1) (cos phi2))) (* (* (sin lambda1) (sin lambda2)) (* (cos phi1) (cos phi2)))))) R)
25.0ms
(acos (+ (* (sin phi1) (sin phi2)) (+ (* (* (cos lambda1) (cos lambda2)) (* (cos phi1) (cos phi2))) (* (* (sin lambda1) (sin lambda2)) (* (cos phi1) (cos phi2))))))

simplify3.8s

Counts
40 → 82
Calls
40 calls:
Slowest
691.0ms
(* (* (* (* (cos lambda1) (cos lambda2)) (* (cos lambda1) (cos lambda2))) (* (cos lambda1) (cos lambda2))) (* (* (* (cos phi1) (cos phi2)) (* (cos phi1) (cos phi2))) (* (cos phi1) (cos phi2))))
295.0ms
(acos (+ (* (cos phi1) (* (cos phi2) (* (sin lambda1) (sin lambda2)))) (+ (* (cos phi1) (* (cos phi2) (* (cos lambda1) (cos lambda2)))) (* (sin phi1) (sin phi2)))))
246.0ms
(acos (+ (* (cos phi1) (* (cos phi2) (* (cos lambda1) (cos lambda2)))) (+ (* (cos phi1) (* (cos phi2) (* (sin lambda1) (sin lambda2)))) (* (sin phi1) (sin phi2)))))
245.0ms
(* R (acos (+ (* (cos phi1) (* (cos phi2) (* (sin lambda1) (sin lambda2)))) (+ (* (cos phi1) (* (cos phi2) (* (cos lambda1) (cos lambda2)))) (* (sin phi1) (sin phi2))))))
243.0ms
(acos (+ (* (cos phi1) (* (cos phi2) (* (cos lambda1) (cos lambda2)))) (+ (* (cos phi1) (* (cos phi2) (* (sin lambda2) (sin lambda1)))) (* (sin phi1) (sin phi2)))))

prune2.4s

Pruning

16 alts after pruning (16 fresh and 0 done)

Merged error: 2.6b

localize22.0ms

Local error

Found 4 expressions with local error:

0.4b
(acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2))))
0.3b
(* (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2)))) R)
0.3b
(fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2)))
0.2b
(* (sin phi1) (sin phi2))

rewrite9.0ms

Algorithm
rewrite-expression-head
Rules
add-cube-cbrt
*-un-lft-identity
add-sqr-sqrt
add-exp-log
associate-*l*
add-cbrt-cube
pow1
add-log-exp
log1p-expm1-u
expm1-log1p-u
associate-*r*
*-commutative
sin-mult
fma-udef
cbrt-unprod
prod-exp
pow-prod-down
acos-asin
Counts
4 → 53
Calls
4 calls:
Slowest
4.0ms
(* (sin phi1) (sin phi2))
3.0ms
(* (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2)))) R)
1.0ms
(acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2))))
0.0ms
(fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2)))

series470.0ms

Counts
4 → 12
Calls
4 calls:
Slowest
301.0ms
(fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2)))
74.0ms
(* (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2)))) R)
71.0ms
(* (sin phi1) (sin phi2))
24.0ms
(acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2))))

simplify1.4s

Counts
23 → 65
Calls
23 calls:
Slowest
230.0ms
(+ (* (cos phi1) (* (cos phi2) (* (cos lambda1) (cos lambda2)))) (+ (* (cos phi1) (* (cos phi2) (* (sin lambda2) (sin lambda1)))) (* (sin phi1) (sin phi2))))
182.0ms
(+ (* (cos phi1) (* (cos phi2) (* (sin lambda1) (sin lambda2)))) (+ (* (cos phi1) (* (cos phi2) (* (cos lambda1) (cos lambda2)))) (* (sin phi1) (sin phi2))))
152.0ms
(acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi1) (cos phi2)) (* (sin phi1) (sin phi2))))
121.0ms
(acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi1) (cos phi2)) (* (sin phi1) (sin phi2))))
121.0ms
(acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi1) (cos phi2)) (* (sin phi1) (sin phi2))))

prune1.9s

Pruning

17 alts after pruning (17 fresh and 0 done)

Merged error: 2.6b

localize25.0ms

Local error

Found 4 expressions with local error:

0.4b
(acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2))))
0.4b
(exp (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2)))))
0.3b
(* (log (exp (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2)))))) R)
0.3b
(log (exp (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2))))))

rewrite11.0ms

Algorithm
rewrite-expression-head
Rules
add-cube-cbrt
*-un-lft-identity
exp-prod
add-sqr-sqrt
log-pow
associate-*l*
pow1
add-log-exp
log1p-expm1-u
add-exp-log
add-cbrt-cube
expm1-log1p-u
log-prod
acos-asin
exp-diff
rem-exp-log
*-commutative
rem-log-exp
log-div
Counts
4 → 59
Calls
4 calls:
Slowest
5.0ms
(* (log (exp (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2)))))) R)
2.0ms
(log (exp (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2))))))
2.0ms
(exp (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2)))))
1.0ms
(acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2))))

series108.0ms

Counts
4 → 12
Calls
4 calls:
Slowest
44.0ms
(exp (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2)))))
42.0ms
(* (log (exp (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2)))))) R)
11.0ms
(acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2))))
10.0ms
(log (exp (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2))))))

simplify3.3s

Counts
30 → 71
Calls
30 calls:
Slowest
479.0ms
(acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2))))
146.0ms
(acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi1) (cos phi2)) (* (sin phi1) (sin phi2))))
142.0ms
(cbrt (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2)))))
140.0ms
(* (cbrt (log (exp (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2))))))) (cbrt (log (exp (acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi2) (cos phi1)) (* (sin phi1) (sin phi2))))))))
134.0ms
(acos (fma (fma (sin lambda2) (sin lambda1) (* (cos lambda1) (cos lambda2))) (* (cos phi1) (cos phi2)) (* (sin phi1) (sin phi2))))

prune2.0s

Pruning

21 alts after pruning (21 fresh and 0 done)

Merged error: 2.6b

regimes3.3s

Accuracy

0% (0.4b remaining)

Error of 3.8b against oracle of 3.4b and baseline of 3.8b

bsearch2.0ms

end0.0ms

sample24.8s

Algorithm
intervals