\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 2.4448816157766584 \cdot 10^{-161}:\\
\;\;\;\;\sqrt[3]{\left(g + \sqrt{g \cdot g - h \cdot h}\right) \cdot \frac{\frac{-1}{2}}{a}} + \sqrt[3]{\left(-g\right) - g} \cdot \sqrt[3]{\frac{1}{\frac{a}{\frac{1}{2}}}}\\
\mathbf{else}:\\
\;\;\;\;\sqrt[3]{\frac{\frac{-1}{2}}{a}} \cdot \sqrt[3]{g + \sqrt{g \cdot g - h \cdot h}} + \sqrt[3]{\frac{\sqrt{g \cdot g - h \cdot h} - g}{\frac{a}{\frac{1}{2}}}}\\
\end{array}double f(double g, double h, double a) {
double r2485015 = 1.0;
double r2485016 = 2.0;
double r2485017 = a;
double r2485018 = r2485016 * r2485017;
double r2485019 = r2485015 / r2485018;
double r2485020 = g;
double r2485021 = -r2485020;
double r2485022 = r2485020 * r2485020;
double r2485023 = h;
double r2485024 = r2485023 * r2485023;
double r2485025 = r2485022 - r2485024;
double r2485026 = sqrt(r2485025);
double r2485027 = r2485021 + r2485026;
double r2485028 = r2485019 * r2485027;
double r2485029 = cbrt(r2485028);
double r2485030 = r2485021 - r2485026;
double r2485031 = r2485019 * r2485030;
double r2485032 = cbrt(r2485031);
double r2485033 = r2485029 + r2485032;
return r2485033;
}
double f(double g, double h, double a) {
double r2485034 = g;
double r2485035 = 2.4448816157766584e-161;
bool r2485036 = r2485034 <= r2485035;
double r2485037 = r2485034 * r2485034;
double r2485038 = h;
double r2485039 = r2485038 * r2485038;
double r2485040 = r2485037 - r2485039;
double r2485041 = sqrt(r2485040);
double r2485042 = r2485034 + r2485041;
double r2485043 = -0.5;
double r2485044 = a;
double r2485045 = r2485043 / r2485044;
double r2485046 = r2485042 * r2485045;
double r2485047 = cbrt(r2485046);
double r2485048 = -r2485034;
double r2485049 = r2485048 - r2485034;
double r2485050 = cbrt(r2485049);
double r2485051 = 1.0;
double r2485052 = 0.5;
double r2485053 = r2485044 / r2485052;
double r2485054 = r2485051 / r2485053;
double r2485055 = cbrt(r2485054);
double r2485056 = r2485050 * r2485055;
double r2485057 = r2485047 + r2485056;
double r2485058 = cbrt(r2485045);
double r2485059 = cbrt(r2485042);
double r2485060 = r2485058 * r2485059;
double r2485061 = r2485041 - r2485034;
double r2485062 = r2485061 / r2485053;
double r2485063 = cbrt(r2485062);
double r2485064 = r2485060 + r2485063;
double r2485065 = r2485036 ? r2485057 : r2485064;
return r2485065;
}



Bits error versus g



Bits error versus h



Bits error versus a
Results
if g < 2.4448816157766584e-161Initial program 36.2
Simplified36.2
rmApplied div-inv36.2
Applied cbrt-prod32.8
Taylor expanded around -inf 31.7
Simplified31.7
if 2.4448816157766584e-161 < g Initial program 33.8
Simplified33.8
rmApplied cbrt-prod30.2
Final simplification31.0
herbie shell --seed 2019155 +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))))))))