\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 -3.2861224039944029 \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 r81997 = b;
double r81998 = -r81997;
double r81999 = r81997 * r81997;
double r82000 = 3.0;
double r82001 = a;
double r82002 = r82000 * r82001;
double r82003 = c;
double r82004 = r82002 * r82003;
double r82005 = r81999 - r82004;
double r82006 = sqrt(r82005);
double r82007 = r81998 + r82006;
double r82008 = r82007 / r82002;
return r82008;
}
double f(double a, double b, double c) {
double r82009 = b;
double r82010 = -r82009;
double r82011 = r82009 * r82009;
double r82012 = 3.0;
double r82013 = a;
double r82014 = r82012 * r82013;
double r82015 = c;
double r82016 = r82014 * r82015;
double r82017 = r82011 - r82016;
double r82018 = sqrt(r82017);
double r82019 = r82010 + r82018;
double r82020 = r82019 / r82014;
double r82021 = -3.286122403994403e-06;
bool r82022 = r82020 <= r82021;
double r82023 = -r82017;
double r82024 = fma(r82009, r82009, r82023);
double r82025 = r82010 - r82018;
double r82026 = r82024 / r82025;
double r82027 = r82026 / r82014;
double r82028 = -0.5;
double r82029 = r82015 / r82009;
double r82030 = r82028 * r82029;
double r82031 = r82022 ? r82027 : r82030;
return r82031;
}



Bits error versus a



Bits error versus b



Bits error versus c
if (/ (+ (- b) (sqrt (- (* b b) (* (* 3.0 a) c)))) (* 3.0 a)) < -3.286122403994403e-06Initial program 17.3
rmApplied flip-+17.3
Simplified16.6
if -3.286122403994403e-06 < (/ (+ (- b) (sqrt (- (* b b) (* (* 3.0 a) c)))) (* 3.0 a)) Initial program 40.9
Taylor expanded around inf 12.6
Final simplification14.7
herbie shell --seed 2020035 +o rules:numerics
(FPCore (a b c)
:name "Cubic critical, narrow range"
:precision binary64
:pre (and (< 1.0536712127723509e-08 a 94906265.62425156) (< 1.0536712127723509e-08 b 94906265.62425156) (< 1.0536712127723509e-08 c 94906265.62425156))
(/ (+ (- b) (sqrt (- (* b b) (* (* 3 a) c)))) (* 3 a)))