\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.8443287896291815 \cdot 10^{-230}:\\
\;\;\;\;\sqrt[3]{\frac{1}{2 \cdot a}} \cdot \sqrt[3]{\left(-g\right) + \left|\sqrt[3]{g \cdot g - h \cdot h}\right| \cdot \sqrt{\sqrt[3]{g \cdot g - h \cdot h}}} + \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(\left(-g\right) + \sqrt{g \cdot g - h \cdot h}\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 r150651 = 1.0;
double r150652 = 2.0;
double r150653 = a;
double r150654 = r150652 * r150653;
double r150655 = r150651 / r150654;
double r150656 = g;
double r150657 = -r150656;
double r150658 = r150656 * r150656;
double r150659 = h;
double r150660 = r150659 * r150659;
double r150661 = r150658 - r150660;
double r150662 = sqrt(r150661);
double r150663 = r150657 + r150662;
double r150664 = r150655 * r150663;
double r150665 = cbrt(r150664);
double r150666 = r150657 - r150662;
double r150667 = r150655 * r150666;
double r150668 = cbrt(r150667);
double r150669 = r150665 + r150668;
return r150669;
}
double f(double g, double h, double a) {
double r150670 = g;
double r150671 = -1.8443287896291815e-230;
bool r150672 = r150670 <= r150671;
double r150673 = 1.0;
double r150674 = 2.0;
double r150675 = a;
double r150676 = r150674 * r150675;
double r150677 = r150673 / r150676;
double r150678 = cbrt(r150677);
double r150679 = -r150670;
double r150680 = r150670 * r150670;
double r150681 = h;
double r150682 = r150681 * r150681;
double r150683 = r150680 - r150682;
double r150684 = cbrt(r150683);
double r150685 = fabs(r150684);
double r150686 = sqrt(r150684);
double r150687 = r150685 * r150686;
double r150688 = r150679 + r150687;
double r150689 = cbrt(r150688);
double r150690 = r150678 * r150689;
double r150691 = sqrt(r150683);
double r150692 = r150679 - r150691;
double r150693 = r150677 * r150692;
double r150694 = cbrt(r150693);
double r150695 = r150690 + r150694;
double r150696 = r150679 + r150691;
double r150697 = r150677 * r150696;
double r150698 = cbrt(r150697);
double r150699 = r150679 - r150670;
double r150700 = cbrt(r150699);
double r150701 = r150678 * r150700;
double r150702 = r150698 + r150701;
double r150703 = r150672 ? r150695 : r150702;
return r150703;
}



Bits error versus g



Bits error versus h



Bits error versus a
Results
if g < -1.8443287896291815e-230Initial program 35.8
rmApplied cbrt-prod32.0
rmApplied add-cube-cbrt32.0
Applied sqrt-prod32.0
Simplified32.0
if -1.8443287896291815e-230 < g Initial program 36.2
rmApplied cbrt-prod32.6
Taylor expanded around inf 32.0
Final simplification32.0
herbie shell --seed 2020089 +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))))))))