\frac{\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}{3 \cdot a}\begin{array}{l}
\mathbf{if}\;\frac{\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}{3 \cdot a} \le -31.396869071336894:\\
\;\;\;\;\frac{\frac{\mathsf{fma}\left(b, b, -\left(b \cdot b - \left(3 \cdot a\right) \cdot c\right)\right)}{\left(-b\right) - \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}}{3 \cdot a}\\
\mathbf{else}:\\
\;\;\;\;-0.5 \cdot \frac{c}{b}\\
\end{array}double f(double a, double b, double c) {
double r85451 = b;
double r85452 = -r85451;
double r85453 = r85451 * r85451;
double r85454 = 3.0;
double r85455 = a;
double r85456 = r85454 * r85455;
double r85457 = c;
double r85458 = r85456 * r85457;
double r85459 = r85453 - r85458;
double r85460 = sqrt(r85459);
double r85461 = r85452 + r85460;
double r85462 = r85461 / r85456;
return r85462;
}
double f(double a, double b, double c) {
double r85463 = b;
double r85464 = -r85463;
double r85465 = r85463 * r85463;
double r85466 = 3.0;
double r85467 = a;
double r85468 = r85466 * r85467;
double r85469 = c;
double r85470 = r85468 * r85469;
double r85471 = r85465 - r85470;
double r85472 = sqrt(r85471);
double r85473 = r85464 + r85472;
double r85474 = r85473 / r85468;
double r85475 = -31.396869071336894;
bool r85476 = r85474 <= r85475;
double r85477 = -r85471;
double r85478 = fma(r85463, r85463, r85477);
double r85479 = r85464 - r85472;
double r85480 = r85478 / r85479;
double r85481 = r85480 / r85468;
double r85482 = -0.5;
double r85483 = r85469 / r85463;
double r85484 = r85482 * r85483;
double r85485 = r85476 ? r85481 : r85484;
return r85485;
}



Bits error versus a



Bits error versus b



Bits error versus c
if (/ (+ (- b) (sqrt (- (* b b) (* (* 3.0 a) c)))) (* 3.0 a)) < -31.396869071336894Initial program 18.9
rmApplied flip-+18.8
Simplified18.1
if -31.396869071336894 < (/ (+ (- b) (sqrt (- (* b b) (* (* 3.0 a) c)))) (* 3.0 a)) Initial program 46.6
Taylor expanded around inf 10.0
Final simplification10.9
herbie shell --seed 2020056 +o rules:numerics
(FPCore (a b c)
:name "Cubic critical, medium range"
:precision binary64
:pre (and (< 1.11022e-16 a 9.0072e+15) (< 1.11022e-16 b 9.0072e+15) (< 1.11022e-16 c 9.0072e+15))
(/ (+ (- b) (sqrt (- (* b b) (* (* 3 a) c)))) (* 3 a)))