\frac{\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}{3 \cdot a}\begin{array}{l}
\mathbf{if}\;b \le -2.675733832275465886979422961103066713356 \cdot 10^{144}:\\
\;\;\;\;0.5 \cdot \frac{c}{b} - 0.6666666666666666296592325124947819858789 \cdot \frac{b}{a}\\
\mathbf{elif}\;b \le 8.955698051059873403585681401912267705382 \cdot 10^{-30}:\\
\;\;\;\;\frac{1}{3} \cdot \frac{\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}{a}\\
\mathbf{else}:\\
\;\;\;\;-0.5 \cdot \frac{c}{b}\\
\end{array}double f(double a, double b, double c) {
double r110008 = b;
double r110009 = -r110008;
double r110010 = r110008 * r110008;
double r110011 = 3.0;
double r110012 = a;
double r110013 = r110011 * r110012;
double r110014 = c;
double r110015 = r110013 * r110014;
double r110016 = r110010 - r110015;
double r110017 = sqrt(r110016);
double r110018 = r110009 + r110017;
double r110019 = r110018 / r110013;
return r110019;
}
double f(double a, double b, double c) {
double r110020 = b;
double r110021 = -2.675733832275466e+144;
bool r110022 = r110020 <= r110021;
double r110023 = 0.5;
double r110024 = c;
double r110025 = r110024 / r110020;
double r110026 = r110023 * r110025;
double r110027 = 0.6666666666666666;
double r110028 = a;
double r110029 = r110020 / r110028;
double r110030 = r110027 * r110029;
double r110031 = r110026 - r110030;
double r110032 = 8.955698051059873e-30;
bool r110033 = r110020 <= r110032;
double r110034 = 1.0;
double r110035 = 3.0;
double r110036 = r110034 / r110035;
double r110037 = -r110020;
double r110038 = r110020 * r110020;
double r110039 = r110035 * r110028;
double r110040 = r110039 * r110024;
double r110041 = r110038 - r110040;
double r110042 = sqrt(r110041);
double r110043 = r110037 + r110042;
double r110044 = r110043 / r110028;
double r110045 = r110036 * r110044;
double r110046 = -0.5;
double r110047 = r110046 * r110025;
double r110048 = r110033 ? r110045 : r110047;
double r110049 = r110022 ? r110031 : r110048;
return r110049;
}



Bits error versus a



Bits error versus b



Bits error versus c
Results
if b < -2.675733832275466e+144Initial program 60.4
Taylor expanded around -inf 2.3
if -2.675733832275466e+144 < b < 8.955698051059873e-30Initial program 14.2
rmApplied *-un-lft-identity14.2
Applied times-frac14.3
if 8.955698051059873e-30 < b Initial program 54.7
Taylor expanded around inf 6.9
Final simplification10.2
herbie shell --seed 2019354 +o rules:numerics
(FPCore (a b c)
:name "Cubic critical"
:precision binary64
(/ (+ (- b) (sqrt (- (* b b) (* (* 3 a) c)))) (* 3 a)))