\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 -2.461145307761444 \cdot 10^{-5}:\\
\;\;\;\;\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 r91286 = b;
double r91287 = -r91286;
double r91288 = r91286 * r91286;
double r91289 = 3.0;
double r91290 = a;
double r91291 = r91289 * r91290;
double r91292 = c;
double r91293 = r91291 * r91292;
double r91294 = r91288 - r91293;
double r91295 = sqrt(r91294);
double r91296 = r91287 + r91295;
double r91297 = r91296 / r91291;
return r91297;
}
double f(double a, double b, double c) {
double r91298 = b;
double r91299 = -r91298;
double r91300 = r91298 * r91298;
double r91301 = 3.0;
double r91302 = a;
double r91303 = r91301 * r91302;
double r91304 = c;
double r91305 = r91303 * r91304;
double r91306 = r91300 - r91305;
double r91307 = sqrt(r91306);
double r91308 = r91299 + r91307;
double r91309 = r91308 / r91303;
double r91310 = -2.461145307761444e-05;
bool r91311 = r91309 <= r91310;
double r91312 = -r91306;
double r91313 = fma(r91298, r91298, r91312);
double r91314 = r91299 - r91307;
double r91315 = r91313 / r91314;
double r91316 = r91315 / r91303;
double r91317 = -0.5;
double r91318 = r91304 / r91298;
double r91319 = r91317 * r91318;
double r91320 = r91311 ? r91316 : r91319;
return r91320;
}



Bits error versus a



Bits error versus b



Bits error versus c
if (/ (+ (- b) (sqrt (- (* b b) (* (* 3.0 a) c)))) (* 3.0 a)) < -2.461145307761444e-05Initial program 16.7
rmApplied flip-+16.7
Simplified15.9
if -2.461145307761444e-05 < (/ (+ (- b) (sqrt (- (* b b) (* (* 3.0 a) c)))) (* 3.0 a)) Initial program 39.0
Taylor expanded around inf 14.1
Final simplification15.0
herbie shell --seed 2020047 +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)))