\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 -1.4363725490879053 \cdot 10^{-6}:\\
\;\;\;\;\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 r93730 = b;
double r93731 = -r93730;
double r93732 = r93730 * r93730;
double r93733 = 3.0;
double r93734 = a;
double r93735 = r93733 * r93734;
double r93736 = c;
double r93737 = r93735 * r93736;
double r93738 = r93732 - r93737;
double r93739 = sqrt(r93738);
double r93740 = r93731 + r93739;
double r93741 = r93740 / r93735;
return r93741;
}
double f(double a, double b, double c) {
double r93742 = b;
double r93743 = -r93742;
double r93744 = r93742 * r93742;
double r93745 = 3.0;
double r93746 = a;
double r93747 = r93745 * r93746;
double r93748 = c;
double r93749 = r93747 * r93748;
double r93750 = r93744 - r93749;
double r93751 = sqrt(r93750);
double r93752 = r93743 + r93751;
double r93753 = r93752 / r93747;
double r93754 = -1.4363725490879053e-06;
bool r93755 = r93753 <= r93754;
double r93756 = -r93750;
double r93757 = fma(r93742, r93742, r93756);
double r93758 = r93743 - r93751;
double r93759 = r93757 / r93758;
double r93760 = r93759 / r93747;
double r93761 = -0.5;
double r93762 = r93748 / r93742;
double r93763 = r93761 * r93762;
double r93764 = r93755 ? r93760 : r93763;
return r93764;
}



Bits error versus a



Bits error versus b



Bits error versus c
if (/ (+ (- b) (sqrt (- (* b b) (* (* 3.0 a) c)))) (* 3.0 a)) < -1.4363725490879053e-06Initial program 21.6
rmApplied flip-+21.6
Simplified20.9
if -1.4363725490879053e-06 < (/ (+ (- b) (sqrt (- (* b b) (* (* 3.0 a) c)))) (* 3.0 a)) Initial program 52.5
Taylor expanded around inf 5.8
Final simplification10.0
herbie shell --seed 2020060 +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)))