\sqrt[3]{\frac{1}{2 \cdot a} \cdot \left(\left(-g\right) + \sqrt{g \cdot g - h \cdot h}\right)} + \sqrt[3]{\frac{1}{2 \cdot a} \cdot \left(\left(-g\right) - \sqrt{g \cdot g - h \cdot h}\right)}\begin{array}{l}
\mathbf{if}\;g \le -1.213814236807820980958444544158686748103 \cdot 10^{-179}:\\
\;\;\;\;\sqrt[3]{\frac{1}{2 \cdot a}} \cdot \sqrt[3]{\sqrt{g \cdot g - h \cdot h} - g} + \sqrt[3]{\frac{1}{2 \cdot a} \cdot \left(\left(-g\right) - \sqrt{g \cdot g - h \cdot h}\right)}\\
\mathbf{else}:\\
\;\;\;\;\sqrt[3]{\frac{1}{2 \cdot a} \cdot \left(\sqrt{g \cdot g - h \cdot h} - g\right)} + \sqrt[3]{\frac{1}{2 \cdot a}} \cdot \sqrt[3]{\left(-g\right) - g}\\
\end{array}double f(double g, double h, double a) {
double r133597 = 1.0;
double r133598 = 2.0;
double r133599 = a;
double r133600 = r133598 * r133599;
double r133601 = r133597 / r133600;
double r133602 = g;
double r133603 = -r133602;
double r133604 = r133602 * r133602;
double r133605 = h;
double r133606 = r133605 * r133605;
double r133607 = r133604 - r133606;
double r133608 = sqrt(r133607);
double r133609 = r133603 + r133608;
double r133610 = r133601 * r133609;
double r133611 = cbrt(r133610);
double r133612 = r133603 - r133608;
double r133613 = r133601 * r133612;
double r133614 = cbrt(r133613);
double r133615 = r133611 + r133614;
return r133615;
}
double f(double g, double h, double a) {
double r133616 = g;
double r133617 = -1.213814236807821e-179;
bool r133618 = r133616 <= r133617;
double r133619 = 1.0;
double r133620 = 2.0;
double r133621 = a;
double r133622 = r133620 * r133621;
double r133623 = r133619 / r133622;
double r133624 = cbrt(r133623);
double r133625 = r133616 * r133616;
double r133626 = h;
double r133627 = r133626 * r133626;
double r133628 = r133625 - r133627;
double r133629 = sqrt(r133628);
double r133630 = r133629 - r133616;
double r133631 = cbrt(r133630);
double r133632 = r133624 * r133631;
double r133633 = -r133616;
double r133634 = r133633 - r133629;
double r133635 = r133623 * r133634;
double r133636 = cbrt(r133635);
double r133637 = r133632 + r133636;
double r133638 = r133623 * r133630;
double r133639 = cbrt(r133638);
double r133640 = r133633 - r133616;
double r133641 = cbrt(r133640);
double r133642 = r133624 * r133641;
double r133643 = r133639 + r133642;
double r133644 = r133618 ? r133637 : r133643;
return r133644;
}



Bits error versus g



Bits error versus h



Bits error versus a
Results
if g < -1.213814236807821e-179Initial program 34.5
Simplified34.5
rmApplied cbrt-prod30.8
if -1.213814236807821e-179 < g Initial program 35.4
Simplified35.4
rmApplied cbrt-prod31.4
Taylor expanded around inf 30.5
Final simplification30.6
herbie shell --seed 2019303 +o rules:numerics
(FPCore (g h a)
:name "2-ancestry mixing, positive discriminant"
:precision binary64
(+ (cbrt (* (/ 1 (* 2 a)) (+ (- g) (sqrt (- (* g g) (* h h)))))) (cbrt (* (/ 1 (* 2 a)) (- (- g) (sqrt (- (* g g) (* h h))))))))