\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.5390950005720738 \cdot 10^{-161}:\\
\;\;\;\;\sqrt[3]{\frac{\sqrt{g \cdot g - h \cdot h} + g}{-2 \cdot a}} + \sqrt[3]{\frac{\frac{1}{2}}{a}} \cdot \sqrt[3]{\left(-g\right) - g}\\
\mathbf{else}:\\
\;\;\;\;\sqrt[3]{\frac{\frac{-1}{2}}{a}} \cdot \sqrt[3]{\sqrt{g \cdot g - h \cdot h} + g} + \sqrt[3]{\frac{\sqrt{g \cdot g - h \cdot h} - g}{2 \cdot a}}\\
\end{array}double f(double g, double h, double a) {
double r5143745 = 1.0;
double r5143746 = 2.0;
double r5143747 = a;
double r5143748 = r5143746 * r5143747;
double r5143749 = r5143745 / r5143748;
double r5143750 = g;
double r5143751 = -r5143750;
double r5143752 = r5143750 * r5143750;
double r5143753 = h;
double r5143754 = r5143753 * r5143753;
double r5143755 = r5143752 - r5143754;
double r5143756 = sqrt(r5143755);
double r5143757 = r5143751 + r5143756;
double r5143758 = r5143749 * r5143757;
double r5143759 = cbrt(r5143758);
double r5143760 = r5143751 - r5143756;
double r5143761 = r5143749 * r5143760;
double r5143762 = cbrt(r5143761);
double r5143763 = r5143759 + r5143762;
return r5143763;
}
double f(double g, double h, double a) {
double r5143764 = g;
double r5143765 = 1.5390950005720738e-161;
bool r5143766 = r5143764 <= r5143765;
double r5143767 = r5143764 * r5143764;
double r5143768 = h;
double r5143769 = r5143768 * r5143768;
double r5143770 = r5143767 - r5143769;
double r5143771 = sqrt(r5143770);
double r5143772 = r5143771 + r5143764;
double r5143773 = -2.0;
double r5143774 = a;
double r5143775 = r5143773 * r5143774;
double r5143776 = r5143772 / r5143775;
double r5143777 = cbrt(r5143776);
double r5143778 = 0.5;
double r5143779 = r5143778 / r5143774;
double r5143780 = cbrt(r5143779);
double r5143781 = -r5143764;
double r5143782 = r5143781 - r5143764;
double r5143783 = cbrt(r5143782);
double r5143784 = r5143780 * r5143783;
double r5143785 = r5143777 + r5143784;
double r5143786 = -0.5;
double r5143787 = r5143786 / r5143774;
double r5143788 = cbrt(r5143787);
double r5143789 = cbrt(r5143772);
double r5143790 = r5143788 * r5143789;
double r5143791 = r5143771 - r5143764;
double r5143792 = 2.0;
double r5143793 = r5143792 * r5143774;
double r5143794 = r5143791 / r5143793;
double r5143795 = cbrt(r5143794);
double r5143796 = r5143790 + r5143795;
double r5143797 = r5143766 ? r5143785 : r5143796;
return r5143797;
}



Bits error versus g



Bits error versus h



Bits error versus a
Results
if g < 1.5390950005720738e-161Initial program 36.4
Simplified36.4
rmApplied div-inv36.4
Applied cbrt-prod32.6
Simplified32.6
Taylor expanded around -inf 31.8
Simplified31.8
if 1.5390950005720738e-161 < g Initial program 34.0
Simplified34.0
rmApplied div-inv34.0
Applied cbrt-prod30.4
Simplified30.3
Final simplification31.1
herbie shell --seed 2019135 +o rules:numerics
(FPCore (g h a)
:name "2-ancestry mixing, positive discriminant"
(+ (cbrt (* (/ 1 (* 2 a)) (+ (- g) (sqrt (- (* g g) (* h h)))))) (cbrt (* (/ 1 (* 2 a)) (- (- g) (sqrt (- (* g g) (* h h))))))))