Average Error: 0 → 0
Time: 8.2m
Precision: 64
\[\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{\sin \left(\lambda_1 - \lambda_2\right) \cdot \cos \phi_2}{(\left(\cos \phi_2\right) \cdot \left(\cos \left(\lambda_1 - \lambda_2\right)\right) + \left(\cos \phi_1\right))_*}\]
\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{\sin \left(\lambda_1 - \lambda_2\right) \cdot \cos \phi_2}{(\left(\cos \phi_2\right) \cdot \left(\cos \left(\lambda_1 - \lambda_2\right)\right) + \left(\cos \phi_1\right))_*}
double f(double lambda1, double lambda2, double phi1, double phi2) {
        double r2584888 = lambda1;
        double r2584889 = phi2;
        double r2584890 = cos(r2584889);
        double r2584891 = lambda2;
        double r2584892 = r2584888 - r2584891;
        double r2584893 = sin(r2584892);
        double r2584894 = r2584890 * r2584893;
        double r2584895 = phi1;
        double r2584896 = cos(r2584895);
        double r2584897 = cos(r2584892);
        double r2584898 = r2584890 * r2584897;
        double r2584899 = r2584896 + r2584898;
        double r2584900 = atan2(r2584894, r2584899);
        double r2584901 = r2584888 + r2584900;
        return r2584901;
}

double f(double lambda1, double lambda2, double phi1, double phi2) {
        double r2584902 = lambda1;
        double r2584903 = lambda2;
        double r2584904 = r2584902 - r2584903;
        double r2584905 = sin(r2584904);
        double r2584906 = phi2;
        double r2584907 = cos(r2584906);
        double r2584908 = r2584905 * r2584907;
        double r2584909 = cos(r2584904);
        double r2584910 = phi1;
        double r2584911 = cos(r2584910);
        double r2584912 = fma(r2584907, r2584909, r2584911);
        double r2584913 = atan2(r2584908, r2584912);
        double r2584914 = r2584902 + r2584913;
        return r2584914;
}

Error

Bits error versus lambda1

Bits error versus lambda2

Bits error versus phi1

Bits error versus phi2

Derivation

  1. Initial program 0

    \[\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)}\]
  2. Simplified0

    \[\leadsto \color{blue}{\tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{(\left(\cos \phi_2\right) \cdot \left(\cos \left(\lambda_1 - \lambda_2\right)\right) + \left(\cos \phi_1\right))_*} + \lambda_1}\]
  3. Final simplification0

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

Reproduce

herbie shell --seed 2019112 +o rules:numerics
(FPCore (lambda1 lambda2 phi1 phi2)
  :name "Midpoint on a great circle"
  (+ lambda1 (atan2 (* (cos phi2) (sin (- lambda1 lambda2))) (+ (cos phi1) (* (cos phi2) (cos (- lambda1 lambda2)))))))