\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 9.325618184987134 \cdot 10^{-167}:\\
\;\;\;\;\sqrt[3]{\left(\sqrt{g \cdot g - h \cdot h} + g\right) \cdot \frac{\frac{-1}{2}}{a}} + \frac{\sqrt[3]{\left(-g\right) - g}}{\sqrt[3]{2 \cdot a}}\\
\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 r30015606 = 1.0;
double r30015607 = 2.0;
double r30015608 = a;
double r30015609 = r30015607 * r30015608;
double r30015610 = r30015606 / r30015609;
double r30015611 = g;
double r30015612 = -r30015611;
double r30015613 = r30015611 * r30015611;
double r30015614 = h;
double r30015615 = r30015614 * r30015614;
double r30015616 = r30015613 - r30015615;
double r30015617 = sqrt(r30015616);
double r30015618 = r30015612 + r30015617;
double r30015619 = r30015610 * r30015618;
double r30015620 = cbrt(r30015619);
double r30015621 = r30015612 - r30015617;
double r30015622 = r30015610 * r30015621;
double r30015623 = cbrt(r30015622);
double r30015624 = r30015620 + r30015623;
return r30015624;
}
double f(double g, double h, double a) {
double r30015625 = g;
double r30015626 = 9.325618184987134e-167;
bool r30015627 = r30015625 <= r30015626;
double r30015628 = r30015625 * r30015625;
double r30015629 = h;
double r30015630 = r30015629 * r30015629;
double r30015631 = r30015628 - r30015630;
double r30015632 = sqrt(r30015631);
double r30015633 = r30015632 + r30015625;
double r30015634 = -0.5;
double r30015635 = a;
double r30015636 = r30015634 / r30015635;
double r30015637 = r30015633 * r30015636;
double r30015638 = cbrt(r30015637);
double r30015639 = -r30015625;
double r30015640 = r30015639 - r30015625;
double r30015641 = cbrt(r30015640);
double r30015642 = 2.0;
double r30015643 = r30015642 * r30015635;
double r30015644 = cbrt(r30015643);
double r30015645 = r30015641 / r30015644;
double r30015646 = r30015638 + r30015645;
double r30015647 = cbrt(r30015636);
double r30015648 = cbrt(r30015633);
double r30015649 = r30015647 * r30015648;
double r30015650 = r30015632 - r30015625;
double r30015651 = r30015650 / r30015643;
double r30015652 = cbrt(r30015651);
double r30015653 = r30015649 + r30015652;
double r30015654 = r30015627 ? r30015646 : r30015653;
return r30015654;
}



Bits error versus g



Bits error versus h



Bits error versus a
Results
if g < 9.325618184987134e-167Initial program 36.2
Simplified36.2
rmApplied cbrt-div32.5
Taylor expanded around -inf 31.8
Simplified31.8
if 9.325618184987134e-167 < g Initial program 34.2
Simplified34.2
rmApplied cbrt-prod30.8
Final simplification31.3
herbie shell --seed 2019119 +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))))))))