\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 -6.278795137825635 \cdot 10^{-169}:\\
\;\;\;\;\sqrt[3]{\frac{\sqrt{g \cdot g - h \cdot h} - g}{2}} \cdot \sqrt[3]{\frac{1}{a}} + \frac{\sqrt[3]{\frac{-1}{2} \cdot \left(\left(-g\right) + g\right)}}{\sqrt[3]{a}}\\
\mathbf{elif}\;g \le 8.518209198794929 \cdot 10^{-155}:\\
\;\;\;\;\frac{\sqrt[3]{\frac{-1}{2} \cdot \left(g + g\right)}}{\sqrt[3]{a}} + \sqrt[3]{\frac{\sqrt{g \cdot g - h \cdot h} - g}{a \cdot 2}}\\
\mathbf{else}:\\
\;\;\;\;\sqrt[3]{\sqrt{g \cdot g - h \cdot h} - g} \cdot \sqrt[3]{\frac{\frac{1}{2}}{a}} + \frac{\sqrt[3]{\frac{-1}{2} \cdot \left(g + \sqrt{g \cdot g - h \cdot h}\right)}}{\sqrt[3]{a}}\\
\end{array}double f(double g, double h, double a) {
double r4918410 = 1.0;
double r4918411 = 2.0;
double r4918412 = a;
double r4918413 = r4918411 * r4918412;
double r4918414 = r4918410 / r4918413;
double r4918415 = g;
double r4918416 = -r4918415;
double r4918417 = r4918415 * r4918415;
double r4918418 = h;
double r4918419 = r4918418 * r4918418;
double r4918420 = r4918417 - r4918419;
double r4918421 = sqrt(r4918420);
double r4918422 = r4918416 + r4918421;
double r4918423 = r4918414 * r4918422;
double r4918424 = cbrt(r4918423);
double r4918425 = r4918416 - r4918421;
double r4918426 = r4918414 * r4918425;
double r4918427 = cbrt(r4918426);
double r4918428 = r4918424 + r4918427;
return r4918428;
}
double f(double g, double h, double a) {
double r4918429 = g;
double r4918430 = -6.278795137825635e-169;
bool r4918431 = r4918429 <= r4918430;
double r4918432 = r4918429 * r4918429;
double r4918433 = h;
double r4918434 = r4918433 * r4918433;
double r4918435 = r4918432 - r4918434;
double r4918436 = sqrt(r4918435);
double r4918437 = r4918436 - r4918429;
double r4918438 = 2.0;
double r4918439 = r4918437 / r4918438;
double r4918440 = cbrt(r4918439);
double r4918441 = 1.0;
double r4918442 = a;
double r4918443 = r4918441 / r4918442;
double r4918444 = cbrt(r4918443);
double r4918445 = r4918440 * r4918444;
double r4918446 = -0.5;
double r4918447 = -r4918429;
double r4918448 = r4918447 + r4918429;
double r4918449 = r4918446 * r4918448;
double r4918450 = cbrt(r4918449);
double r4918451 = cbrt(r4918442);
double r4918452 = r4918450 / r4918451;
double r4918453 = r4918445 + r4918452;
double r4918454 = 8.518209198794929e-155;
bool r4918455 = r4918429 <= r4918454;
double r4918456 = r4918429 + r4918429;
double r4918457 = r4918446 * r4918456;
double r4918458 = cbrt(r4918457);
double r4918459 = r4918458 / r4918451;
double r4918460 = r4918442 * r4918438;
double r4918461 = r4918437 / r4918460;
double r4918462 = cbrt(r4918461);
double r4918463 = r4918459 + r4918462;
double r4918464 = cbrt(r4918437);
double r4918465 = 0.5;
double r4918466 = r4918465 / r4918442;
double r4918467 = cbrt(r4918466);
double r4918468 = r4918464 * r4918467;
double r4918469 = r4918429 + r4918436;
double r4918470 = r4918446 * r4918469;
double r4918471 = cbrt(r4918470);
double r4918472 = r4918471 / r4918451;
double r4918473 = r4918468 + r4918472;
double r4918474 = r4918455 ? r4918463 : r4918473;
double r4918475 = r4918431 ? r4918453 : r4918474;
return r4918475;
}



Bits error versus g



Bits error versus h



Bits error versus a
Results
if g < -6.278795137825635e-169Initial program 35.1
Simplified35.0
rmApplied associate-*r/35.0
Applied cbrt-div35.0
rmApplied *-un-lft-identity35.0
Applied *-un-lft-identity35.0
Applied distribute-lft-out--35.0
Applied times-frac35.0
Applied cbrt-prod30.9
rmApplied fma-neg30.9
Taylor expanded around -inf 30.7
Simplified30.7
if -6.278795137825635e-169 < g < 8.518209198794929e-155Initial program 54.1
Simplified54.1
rmApplied associate-*r/54.1
Applied cbrt-div50.5
Taylor expanded around inf 37.8
if 8.518209198794929e-155 < g Initial program 34.8
Simplified34.8
rmApplied associate-*r/34.8
Applied cbrt-div31.2
rmApplied div-inv31.2
Applied cbrt-prod31.2
Simplified31.2
Final simplification31.3
herbie shell --seed 2019133 +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))))))))