Average Error: 34.1 → 10.7
Time: 1.6m
Precision: 64
\[\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 -1.1446001462836007 \cdot 10^{+58}:\\ \;\;\;\;\frac{1}{3 \cdot a} \cdot \mathsf{fma}\left(\frac{3}{2}, \frac{c}{\frac{b}{a}}, b \cdot -2\right)\\ \mathbf{elif}\;b \le 1.1094847447691107 \cdot 10^{-113}:\\ \;\;\;\;\frac{\frac{\sqrt{\mathsf{fma}\left(-3, c \cdot a, b \cdot b\right)}}{3}}{a} - \frac{\frac{b}{3}}{a}\\ \mathbf{else}:\\ \;\;\;\;\frac{c}{b} \cdot \frac{-1}{2}\\ \end{array}\]
\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 -1.1446001462836007 \cdot 10^{+58}:\\
\;\;\;\;\frac{1}{3 \cdot a} \cdot \mathsf{fma}\left(\frac{3}{2}, \frac{c}{\frac{b}{a}}, b \cdot -2\right)\\

\mathbf{elif}\;b \le 1.1094847447691107 \cdot 10^{-113}:\\
\;\;\;\;\frac{\frac{\sqrt{\mathsf{fma}\left(-3, c \cdot a, b \cdot b\right)}}{3}}{a} - \frac{\frac{b}{3}}{a}\\

\mathbf{else}:\\
\;\;\;\;\frac{c}{b} \cdot \frac{-1}{2}\\

\end{array}
double f(double a, double b, double c) {
        double r4579523 = b;
        double r4579524 = -r4579523;
        double r4579525 = r4579523 * r4579523;
        double r4579526 = 3.0;
        double r4579527 = a;
        double r4579528 = r4579526 * r4579527;
        double r4579529 = c;
        double r4579530 = r4579528 * r4579529;
        double r4579531 = r4579525 - r4579530;
        double r4579532 = sqrt(r4579531);
        double r4579533 = r4579524 + r4579532;
        double r4579534 = r4579533 / r4579528;
        return r4579534;
}

double f(double a, double b, double c) {
        double r4579535 = b;
        double r4579536 = -1.1446001462836007e+58;
        bool r4579537 = r4579535 <= r4579536;
        double r4579538 = 1.0;
        double r4579539 = 3.0;
        double r4579540 = a;
        double r4579541 = r4579539 * r4579540;
        double r4579542 = r4579538 / r4579541;
        double r4579543 = 1.5;
        double r4579544 = c;
        double r4579545 = r4579535 / r4579540;
        double r4579546 = r4579544 / r4579545;
        double r4579547 = -2.0;
        double r4579548 = r4579535 * r4579547;
        double r4579549 = fma(r4579543, r4579546, r4579548);
        double r4579550 = r4579542 * r4579549;
        double r4579551 = 1.1094847447691107e-113;
        bool r4579552 = r4579535 <= r4579551;
        double r4579553 = -3.0;
        double r4579554 = r4579544 * r4579540;
        double r4579555 = r4579535 * r4579535;
        double r4579556 = fma(r4579553, r4579554, r4579555);
        double r4579557 = sqrt(r4579556);
        double r4579558 = r4579557 / r4579539;
        double r4579559 = r4579558 / r4579540;
        double r4579560 = r4579535 / r4579539;
        double r4579561 = r4579560 / r4579540;
        double r4579562 = r4579559 - r4579561;
        double r4579563 = r4579544 / r4579535;
        double r4579564 = -0.5;
        double r4579565 = r4579563 * r4579564;
        double r4579566 = r4579552 ? r4579562 : r4579565;
        double r4579567 = r4579537 ? r4579550 : r4579566;
        return r4579567;
}

Error

Bits error versus a

Bits error versus b

Bits error versus c

Derivation

  1. Split input into 3 regimes
  2. if b < -1.1446001462836007e+58

    1. Initial program 37.5

      \[\frac{\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}{3 \cdot a}\]
    2. Using strategy rm
    3. Applied div-inv37.5

      \[\leadsto \color{blue}{\left(\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}\right) \cdot \frac{1}{3 \cdot a}}\]
    4. Taylor expanded around -inf 10.8

      \[\leadsto \color{blue}{\left(\frac{3}{2} \cdot \frac{a \cdot c}{b} - 2 \cdot b\right)} \cdot \frac{1}{3 \cdot a}\]
    5. Simplified5.9

      \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{3}{2}, \frac{c}{\frac{b}{a}}, -2 \cdot b\right)} \cdot \frac{1}{3 \cdot a}\]

    if -1.1446001462836007e+58 < b < 1.1094847447691107e-113

    1. Initial program 12.9

      \[\frac{\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}{3 \cdot a}\]
    2. Using strategy rm
    3. Applied associate-/r*13.0

      \[\leadsto \color{blue}{\frac{\frac{\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}{3}}{a}}\]
    4. Simplified12.9

      \[\leadsto \frac{\color{blue}{\frac{\sqrt{\mathsf{fma}\left(-3, a \cdot c, b \cdot b\right)} - b}{3}}}{a}\]
    5. Using strategy rm
    6. Applied div-sub12.9

      \[\leadsto \frac{\color{blue}{\frac{\sqrt{\mathsf{fma}\left(-3, a \cdot c, b \cdot b\right)}}{3} - \frac{b}{3}}}{a}\]
    7. Applied div-sub12.9

      \[\leadsto \color{blue}{\frac{\frac{\sqrt{\mathsf{fma}\left(-3, a \cdot c, b \cdot b\right)}}{3}}{a} - \frac{\frac{b}{3}}{a}}\]
    8. Using strategy rm
    9. Applied *-un-lft-identity12.9

      \[\leadsto \frac{\frac{\sqrt{\mathsf{fma}\left(-3, a \cdot c, b \cdot b\right)}}{3}}{\color{blue}{1 \cdot a}} - \frac{\frac{b}{3}}{a}\]
    10. Applied associate-/r*12.9

      \[\leadsto \color{blue}{\frac{\frac{\frac{\sqrt{\mathsf{fma}\left(-3, a \cdot c, b \cdot b\right)}}{3}}{1}}{a}} - \frac{\frac{b}{3}}{a}\]
    11. Simplified12.9

      \[\leadsto \frac{\color{blue}{\frac{\sqrt{\mathsf{fma}\left(-3, c \cdot a, b \cdot b\right)}}{3}}}{a} - \frac{\frac{b}{3}}{a}\]

    if 1.1094847447691107e-113 < b

    1. Initial program 51.6

      \[\frac{\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}{3 \cdot a}\]
    2. Taylor expanded around inf 10.8

      \[\leadsto \color{blue}{\frac{-1}{2} \cdot \frac{c}{b}}\]
  3. Recombined 3 regimes into one program.
  4. Final simplification10.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \le -1.1446001462836007 \cdot 10^{+58}:\\ \;\;\;\;\frac{1}{3 \cdot a} \cdot \mathsf{fma}\left(\frac{3}{2}, \frac{c}{\frac{b}{a}}, b \cdot -2\right)\\ \mathbf{elif}\;b \le 1.1094847447691107 \cdot 10^{-113}:\\ \;\;\;\;\frac{\frac{\sqrt{\mathsf{fma}\left(-3, c \cdot a, b \cdot b\right)}}{3}}{a} - \frac{\frac{b}{3}}{a}\\ \mathbf{else}:\\ \;\;\;\;\frac{c}{b} \cdot \frac{-1}{2}\\ \end{array}\]

Reproduce

herbie shell --seed 2019141 +o rules:numerics
(FPCore (a b c)
  :name "Cubic critical"
  (/ (+ (- b) (sqrt (- (* b b) (* (* 3 a) c)))) (* 3 a)))