\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.191731187329127127438182160139194041057 \cdot 10^{-156}:\\
\;\;\;\;\sqrt[3]{\left(\left(-g\right) - \sqrt{g \cdot g - h \cdot h}\right) \cdot \frac{1}{a \cdot 2}} + \sqrt[3]{\left(-g\right) - g} \cdot \sqrt[3]{\frac{\frac{1}{2}}{a}}\\
\mathbf{else}:\\
\;\;\;\;\frac{\sqrt[3]{\left(-1\right) \cdot \left(\sqrt{\left(g - h\right) \cdot \left(h + g\right)} + g\right)}}{\sqrt[3]{a \cdot 2}} + \sqrt{\sqrt[3]{\left(\sqrt{\left(g - h\right) \cdot \left(h + g\right)} - g\right) \cdot \frac{\frac{1}{a}}{2}}} \cdot \sqrt{\sqrt[3]{\left(\sqrt{\left(g - h\right) \cdot \left(h + g\right)} - g\right) \cdot \frac{\frac{1}{a}}{2}}}\\
\end{array}double f(double g, double h, double a) {
double r133448 = 1.0;
double r133449 = 2.0;
double r133450 = a;
double r133451 = r133449 * r133450;
double r133452 = r133448 / r133451;
double r133453 = g;
double r133454 = -r133453;
double r133455 = r133453 * r133453;
double r133456 = h;
double r133457 = r133456 * r133456;
double r133458 = r133455 - r133457;
double r133459 = sqrt(r133458);
double r133460 = r133454 + r133459;
double r133461 = r133452 * r133460;
double r133462 = cbrt(r133461);
double r133463 = r133454 - r133459;
double r133464 = r133452 * r133463;
double r133465 = cbrt(r133464);
double r133466 = r133462 + r133465;
return r133466;
}
double f(double g, double h, double a) {
double r133467 = g;
double r133468 = 9.191731187329127e-156;
bool r133469 = r133467 <= r133468;
double r133470 = -r133467;
double r133471 = r133467 * r133467;
double r133472 = h;
double r133473 = r133472 * r133472;
double r133474 = r133471 - r133473;
double r133475 = sqrt(r133474);
double r133476 = r133470 - r133475;
double r133477 = 1.0;
double r133478 = a;
double r133479 = 2.0;
double r133480 = r133478 * r133479;
double r133481 = r133477 / r133480;
double r133482 = r133476 * r133481;
double r133483 = cbrt(r133482);
double r133484 = r133470 - r133467;
double r133485 = cbrt(r133484);
double r133486 = r133477 / r133479;
double r133487 = r133486 / r133478;
double r133488 = cbrt(r133487);
double r133489 = r133485 * r133488;
double r133490 = r133483 + r133489;
double r133491 = -r133477;
double r133492 = r133467 - r133472;
double r133493 = r133472 + r133467;
double r133494 = r133492 * r133493;
double r133495 = sqrt(r133494);
double r133496 = r133495 + r133467;
double r133497 = r133491 * r133496;
double r133498 = cbrt(r133497);
double r133499 = cbrt(r133480);
double r133500 = r133498 / r133499;
double r133501 = r133495 - r133467;
double r133502 = r133477 / r133478;
double r133503 = r133502 / r133479;
double r133504 = r133501 * r133503;
double r133505 = cbrt(r133504);
double r133506 = sqrt(r133505);
double r133507 = r133506 * r133506;
double r133508 = r133500 + r133507;
double r133509 = r133469 ? r133490 : r133508;
return r133509;
}



Bits error versus g



Bits error versus h



Bits error versus a
Results
if g < 9.191731187329127e-156Initial program 36.3
rmApplied cbrt-prod32.5
Simplified32.4
Simplified32.4
Taylor expanded around -inf 31.2
Simplified31.2
if 9.191731187329127e-156 < g Initial program 34.3
rmApplied associate-*l/34.3
Applied cbrt-div30.5
Simplified30.5
rmApplied add-sqr-sqrt30.8
Simplified30.8
Simplified30.8
Final simplification31.0
herbie shell --seed 2019179 +o rules:numerics
(FPCore (g h a)
:name "2-ancestry mixing, positive discriminant"
(+ (cbrt (* (/ 1.0 (* 2.0 a)) (+ (- g) (sqrt (- (* g g) (* h h)))))) (cbrt (* (/ 1.0 (* 2.0 a)) (- (- g) (sqrt (- (* g g) (* h h))))))))