R \cdot \left(2 \cdot \tan^{-1}_* \frac{\sqrt{{\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)R \cdot \left(2 \cdot \tan^{-1}_* \frac{\sqrt{{\left(\sin \left(\frac{\phi_1}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right)}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r129142 = R;
double r129143 = 2.0;
double r129144 = phi1;
double r129145 = phi2;
double r129146 = r129144 - r129145;
double r129147 = r129146 / r129143;
double r129148 = sin(r129147);
double r129149 = pow(r129148, r129143);
double r129150 = cos(r129144);
double r129151 = cos(r129145);
double r129152 = r129150 * r129151;
double r129153 = lambda1;
double r129154 = lambda2;
double r129155 = r129153 - r129154;
double r129156 = r129155 / r129143;
double r129157 = sin(r129156);
double r129158 = r129152 * r129157;
double r129159 = r129158 * r129157;
double r129160 = r129149 + r129159;
double r129161 = sqrt(r129160);
double r129162 = 1.0;
double r129163 = r129162 - r129160;
double r129164 = sqrt(r129163);
double r129165 = atan2(r129161, r129164);
double r129166 = r129143 * r129165;
double r129167 = r129142 * r129166;
return r129167;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r129168 = R;
double r129169 = 2.0;
double r129170 = phi1;
double r129171 = r129170 / r129169;
double r129172 = sin(r129171);
double r129173 = phi2;
double r129174 = r129173 / r129169;
double r129175 = cos(r129174);
double r129176 = r129172 * r129175;
double r129177 = cos(r129171);
double r129178 = sin(r129174);
double r129179 = r129177 * r129178;
double r129180 = r129176 - r129179;
double r129181 = pow(r129180, r129169);
double r129182 = cos(r129170);
double r129183 = cos(r129173);
double r129184 = r129182 * r129183;
double r129185 = lambda1;
double r129186 = lambda2;
double r129187 = r129185 - r129186;
double r129188 = r129187 / r129169;
double r129189 = sin(r129188);
double r129190 = r129184 * r129189;
double r129191 = log1p(r129189);
double r129192 = expm1(r129191);
double r129193 = r129190 * r129192;
double r129194 = r129181 + r129193;
double r129195 = sqrt(r129194);
double r129196 = 1.0;
double r129197 = r129196 - r129194;
double r129198 = sqrt(r129197);
double r129199 = atan2(r129195, r129198);
double r129200 = r129169 * r129199;
double r129201 = r129168 * r129200;
return r129201;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.2
rmApplied div-sub24.2
Applied sin-diff23.6
rmApplied div-sub23.6
Applied sin-diff14.1
rmApplied expm1-log1p-u14.1
rmApplied expm1-log1p-u14.1
Final simplification14.1
herbie shell --seed 2020081 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
:precision binary64
(* R (* 2 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2)) 2) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2))) (sin (/ (- lambda1 lambda2) 2))))) (sqrt (- 1 (+ (pow (sin (/ (- phi1 phi2) 2)) 2) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2))) (sin (/ (- lambda1 lambda2) 2))))))))))