\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.39405526230288124:\\
\;\;\;\;\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 r96695 = b;
double r96696 = -r96695;
double r96697 = r96695 * r96695;
double r96698 = 3.0;
double r96699 = a;
double r96700 = r96698 * r96699;
double r96701 = c;
double r96702 = r96700 * r96701;
double r96703 = r96697 - r96702;
double r96704 = sqrt(r96703);
double r96705 = r96696 + r96704;
double r96706 = r96705 / r96700;
return r96706;
}
double f(double a, double b, double c) {
double r96707 = b;
double r96708 = -r96707;
double r96709 = r96707 * r96707;
double r96710 = 3.0;
double r96711 = a;
double r96712 = r96710 * r96711;
double r96713 = c;
double r96714 = r96712 * r96713;
double r96715 = r96709 - r96714;
double r96716 = sqrt(r96715);
double r96717 = r96708 + r96716;
double r96718 = r96717 / r96712;
double r96719 = -1.3940552623028812;
bool r96720 = r96718 <= r96719;
double r96721 = -r96715;
double r96722 = fma(r96707, r96707, r96721);
double r96723 = r96708 - r96716;
double r96724 = r96722 / r96723;
double r96725 = r96724 / r96712;
double r96726 = -0.5;
double r96727 = r96713 / r96707;
double r96728 = r96726 * r96727;
double r96729 = r96720 ? r96725 : r96728;
return r96729;
}



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.3940552623028812Initial program 19.3
rmApplied flip-+19.3
Simplified18.5
if -1.3940552623028812 < (/ (+ (- b) (sqrt (- (* b b) (* (* 3.0 a) c)))) (* 3.0 a)) Initial program 47.6
Taylor expanded around inf 9.2
Final simplification10.5
herbie shell --seed 2020021 +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)))