\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.326187131265651 \cdot 10^{-10}:\\
\;\;\;\;\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 r86595 = b;
double r86596 = -r86595;
double r86597 = r86595 * r86595;
double r86598 = 3.0;
double r86599 = a;
double r86600 = r86598 * r86599;
double r86601 = c;
double r86602 = r86600 * r86601;
double r86603 = r86597 - r86602;
double r86604 = sqrt(r86603);
double r86605 = r86596 + r86604;
double r86606 = r86605 / r86600;
return r86606;
}
double f(double a, double b, double c) {
double r86607 = b;
double r86608 = -r86607;
double r86609 = r86607 * r86607;
double r86610 = 3.0;
double r86611 = a;
double r86612 = r86610 * r86611;
double r86613 = c;
double r86614 = r86612 * r86613;
double r86615 = r86609 - r86614;
double r86616 = sqrt(r86615);
double r86617 = r86608 + r86616;
double r86618 = r86617 / r86612;
double r86619 = -2.326187131265651e-10;
bool r86620 = r86618 <= r86619;
double r86621 = -r86615;
double r86622 = fma(r86607, r86607, r86621);
double r86623 = r86608 - r86616;
double r86624 = r86622 / r86623;
double r86625 = r86624 / r86612;
double r86626 = -0.5;
double r86627 = r86613 / r86607;
double r86628 = r86626 * r86627;
double r86629 = r86620 ? r86625 : r86628;
return r86629;
}



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.326187131265651e-10Initial program 23.1
rmApplied flip-+23.1
Simplified22.3
if -2.326187131265651e-10 < (/ (+ (- b) (sqrt (- (* b b) (* (* 3.0 a) c)))) (* 3.0 a)) Initial program 58.1
Taylor expanded around inf 2.4
Final simplification5.7
herbie shell --seed 2020036 +o rules:numerics
(FPCore (a b c)
:name "Cubic critical, wide range"
:precision binary64
:pre (and (< 4.9303800000000003e-32 a 2.02824e+31) (< 4.9303800000000003e-32 b 2.02824e+31) (< 4.9303800000000003e-32 c 2.02824e+31))
(/ (+ (- b) (sqrt (- (* b b) (* (* 3 a) c)))) (* 3 a)))