Average Error: 0.7 → 0.2
Time: 16.1s
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{\cos \phi_2 \cdot \left(\sin \lambda_1 \cdot \cos \lambda_2 - \mathsf{log1p}\left(\mathsf{expm1}\left(\cos \lambda_1 \cdot \sin \lambda_2\right)\right)\right)}{\cos \phi_2 \cdot \mathsf{fma}\left(\cos \lambda_2, \cos \lambda_1, \sin \lambda_1 \cdot \sin \lambda_2\right) + \cos \phi_1}\]
\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 - \mathsf{log1p}\left(\mathsf{expm1}\left(\cos \lambda_1 \cdot \sin \lambda_2\right)\right)\right)}{\cos \phi_2 \cdot \mathsf{fma}\left(\cos \lambda_2, \cos \lambda_1, \sin \lambda_1 \cdot \sin \lambda_2\right) + \cos \phi_1}
double f(double lambda1, double lambda2, double phi1, double phi2) {
        double r38990 = lambda1;
        double r38991 = phi2;
        double r38992 = cos(r38991);
        double r38993 = lambda2;
        double r38994 = r38990 - r38993;
        double r38995 = sin(r38994);
        double r38996 = r38992 * r38995;
        double r38997 = phi1;
        double r38998 = cos(r38997);
        double r38999 = cos(r38994);
        double r39000 = r38992 * r38999;
        double r39001 = r38998 + r39000;
        double r39002 = atan2(r38996, r39001);
        double r39003 = r38990 + r39002;
        return r39003;
}

double f(double lambda1, double lambda2, double phi1, double phi2) {
        double r39004 = lambda1;
        double r39005 = phi2;
        double r39006 = cos(r39005);
        double r39007 = sin(r39004);
        double r39008 = lambda2;
        double r39009 = cos(r39008);
        double r39010 = r39007 * r39009;
        double r39011 = cos(r39004);
        double r39012 = sin(r39008);
        double r39013 = r39011 * r39012;
        double r39014 = expm1(r39013);
        double r39015 = log1p(r39014);
        double r39016 = r39010 - r39015;
        double r39017 = r39006 * r39016;
        double r39018 = r39007 * r39012;
        double r39019 = fma(r39009, r39011, r39018);
        double r39020 = r39006 * r39019;
        double r39021 = phi1;
        double r39022 = cos(r39021);
        double r39023 = r39020 + r39022;
        double r39024 = atan2(r39017, r39023);
        double r39025 = r39004 + r39024;
        return r39025;
}

Error

Bits error versus lambda1

Bits error versus lambda2

Bits error versus phi1

Bits error versus phi2

Derivation

  1. Initial program 0.7

    \[\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.7

    \[\leadsto \color{blue}{\lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \sin \left(\lambda_1 - \lambda_2\right)}{\mathsf{fma}\left(\cos \phi_2, \cos \left(\lambda_1 - \lambda_2\right), \cos \phi_1\right)}}\]
  3. Using strategy rm
  4. Applied sin-diff0.7

    \[\leadsto \lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \color{blue}{\left(\sin \lambda_1 \cdot \cos \lambda_2 - \cos \lambda_1 \cdot \sin \lambda_2\right)}}{\mathsf{fma}\left(\cos \phi_2, \cos \left(\lambda_1 - \lambda_2\right), \cos \phi_1\right)}\]
  5. Using strategy rm
  6. Applied sub-neg0.7

    \[\leadsto \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)}{\mathsf{fma}\left(\cos \phi_2, \cos \color{blue}{\left(\lambda_1 + \left(-\lambda_2\right)\right)}, \cos \phi_1\right)}\]
  7. Applied cos-sum0.2

    \[\leadsto \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)}{\mathsf{fma}\left(\cos \phi_2, \color{blue}{\cos \lambda_1 \cdot \cos \left(-\lambda_2\right) - \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)}, \cos \phi_1\right)}\]
  8. Simplified0.2

    \[\leadsto \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)}{\mathsf{fma}\left(\cos \phi_2, \color{blue}{\cos \lambda_1 \cdot \cos \lambda_2} - \sin \lambda_1 \cdot \sin \left(-\lambda_2\right), \cos \phi_1\right)}\]
  9. Using strategy rm
  10. Applied log1p-expm1-u0.2

    \[\leadsto \lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \left(\sin \lambda_1 \cdot \cos \lambda_2 - \color{blue}{\mathsf{log1p}\left(\mathsf{expm1}\left(\cos \lambda_1 \cdot \sin \lambda_2\right)\right)}\right)}{\mathsf{fma}\left(\cos \phi_2, \cos \lambda_1 \cdot \cos \lambda_2 - \sin \lambda_1 \cdot \sin \left(-\lambda_2\right), \cos \phi_1\right)}\]
  11. Using strategy rm
  12. Applied fma-udef0.2

    \[\leadsto \lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \left(\sin \lambda_1 \cdot \cos \lambda_2 - \mathsf{log1p}\left(\mathsf{expm1}\left(\cos \lambda_1 \cdot \sin \lambda_2\right)\right)\right)}{\color{blue}{\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 - \sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right) + \cos \phi_1}}\]
  13. Simplified0.2

    \[\leadsto \lambda_1 + \tan^{-1}_* \frac{\cos \phi_2 \cdot \left(\sin \lambda_1 \cdot \cos \lambda_2 - \mathsf{log1p}\left(\mathsf{expm1}\left(\cos \lambda_1 \cdot \sin \lambda_2\right)\right)\right)}{\color{blue}{\cos \phi_2 \cdot \mathsf{fma}\left(\cos \lambda_2, \cos \lambda_1, \sin \lambda_1 \cdot \sin \lambda_2\right)} + \cos \phi_1}\]
  14. Final simplification0.2

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

Reproduce

herbie shell --seed 2020045 +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)))))))