\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{\cos \phi_2 \cdot \left(\sin \lambda_1 \cdot \cos \lambda_2 - \cos \lambda_1 \cdot \sin \lambda_2\right)}{\frac{{\left(\cos \phi_1\right)}^{3} + {\left(\cos \phi_2 \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right)}^{3}}{\left(\cos \phi_2 \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right) \cdot \left(\cos \phi_2 \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \sin \lambda_1 \cdot \sin \lambda_2\right) - \cos \phi_1\right) + \cos \phi_1 \cdot \cos \phi_1}}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r43196 = lambda1;
double r43197 = phi2;
double r43198 = cos(r43197);
double r43199 = lambda2;
double r43200 = r43196 - r43199;
double r43201 = sin(r43200);
double r43202 = r43198 * r43201;
double r43203 = phi1;
double r43204 = cos(r43203);
double r43205 = cos(r43200);
double r43206 = r43198 * r43205;
double r43207 = r43204 + r43206;
double r43208 = atan2(r43202, r43207);
double r43209 = r43196 + r43208;
return r43209;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r43210 = lambda1;
double r43211 = phi2;
double r43212 = cos(r43211);
double r43213 = sin(r43210);
double r43214 = lambda2;
double r43215 = cos(r43214);
double r43216 = r43213 * r43215;
double r43217 = cos(r43210);
double r43218 = sin(r43214);
double r43219 = r43217 * r43218;
double r43220 = r43216 - r43219;
double r43221 = r43212 * r43220;
double r43222 = phi1;
double r43223 = cos(r43222);
double r43224 = 3.0;
double r43225 = pow(r43223, r43224);
double r43226 = r43215 * r43217;
double r43227 = r43213 * r43218;
double r43228 = r43226 + r43227;
double r43229 = r43212 * r43228;
double r43230 = pow(r43229, r43224);
double r43231 = r43225 + r43230;
double r43232 = r43229 - r43223;
double r43233 = r43229 * r43232;
double r43234 = r43223 * r43223;
double r43235 = r43233 + r43234;
double r43236 = r43231 / r43235;
double r43237 = atan2(r43221, r43236);
double r43238 = r43210 + r43237;
return r43238;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 0.9
rmApplied sin-diff0.9
rmApplied cos-diff0.2
Simplified0.2
rmApplied flip3-+0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2020046
(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)))))))