\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{\cos \phi_1 + \cos \phi_2 \cdot \cos \left(\lambda_1 - \lambda_2\right)}\lambda_1 + \tan^{-1}_* \frac{\left(\sin \lambda_1 \cdot \cos \lambda_2\right) \cdot \cos \phi_2 + \left(\cos \lambda_1 \cdot \sin \left(-\lambda_2\right)\right) \cdot \cos \phi_2}{\mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_1 \cdot \sin \lambda_2\right) \cdot \cos \phi_2 + \cos \phi_1}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r35367 = lambda1;
double r35368 = phi2;
double r35369 = cos(r35368);
double r35370 = lambda2;
double r35371 = r35367 - r35370;
double r35372 = sin(r35371);
double r35373 = r35369 * r35372;
double r35374 = phi1;
double r35375 = cos(r35374);
double r35376 = cos(r35371);
double r35377 = r35369 * r35376;
double r35378 = r35375 + r35377;
double r35379 = atan2(r35373, r35378);
double r35380 = r35367 + r35379;
return r35380;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r35381 = lambda1;
double r35382 = sin(r35381);
double r35383 = lambda2;
double r35384 = cos(r35383);
double r35385 = r35382 * r35384;
double r35386 = phi2;
double r35387 = cos(r35386);
double r35388 = r35385 * r35387;
double r35389 = cos(r35381);
double r35390 = -r35383;
double r35391 = sin(r35390);
double r35392 = r35389 * r35391;
double r35393 = r35392 * r35387;
double r35394 = r35388 + r35393;
double r35395 = sin(r35383);
double r35396 = r35382 * r35395;
double r35397 = fma(r35389, r35384, r35396);
double r35398 = r35397 * r35387;
double r35399 = phi1;
double r35400 = cos(r35399);
double r35401 = r35398 + r35400;
double r35402 = atan2(r35394, r35401);
double r35403 = r35381 + r35402;
return r35403;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 0.9
Simplified0.9
rmApplied sub-neg0.9
Applied sin-sum0.8
Applied distribute-lft-in0.8
Simplified0.8
Simplified0.8
rmApplied cos-diff0.2
rmApplied fma-udef0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2019326 +o rules:numerics
(FPCore (lambda1 lambda2 phi1 phi2)
:name "Midpoint on a great circle"
:precision binary64
(+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ (cos phi1) (* (cos phi2) (cos (- lambda1 lambda2)))))))