Average Error: 33.8 → 10.2
Time: 4.8s
Precision: 64
\[\frac{\left(-b\right) - \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}}{2 \cdot a}\]
\[\begin{array}{l} \mathbf{if}\;b \le -1.369694371126339229257094016308893237032 \cdot 10^{-83}:\\ \;\;\;\;-1 \cdot \frac{c}{b}\\ \mathbf{elif}\;b \le 2.678238127073728805877873599258558355989 \cdot 10^{53}:\\ \;\;\;\;\frac{\mathsf{fma}\left(-\sqrt[3]{b} \cdot \sqrt[3]{b}, \sqrt[3]{b}, -\sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}\right)}{2 \cdot a}\\ \mathbf{else}:\\ \;\;\;\;1 \cdot \left(\frac{c}{b} - \frac{b}{a}\right)\\ \end{array}\]
\frac{\left(-b\right) - \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}}{2 \cdot a}
\begin{array}{l}
\mathbf{if}\;b \le -1.369694371126339229257094016308893237032 \cdot 10^{-83}:\\
\;\;\;\;-1 \cdot \frac{c}{b}\\

\mathbf{elif}\;b \le 2.678238127073728805877873599258558355989 \cdot 10^{53}:\\
\;\;\;\;\frac{\mathsf{fma}\left(-\sqrt[3]{b} \cdot \sqrt[3]{b}, \sqrt[3]{b}, -\sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}\right)}{2 \cdot a}\\

\mathbf{else}:\\
\;\;\;\;1 \cdot \left(\frac{c}{b} - \frac{b}{a}\right)\\

\end{array}
double f(double a, double b, double c) {
        double r82408 = b;
        double r82409 = -r82408;
        double r82410 = r82408 * r82408;
        double r82411 = 4.0;
        double r82412 = a;
        double r82413 = c;
        double r82414 = r82412 * r82413;
        double r82415 = r82411 * r82414;
        double r82416 = r82410 - r82415;
        double r82417 = sqrt(r82416);
        double r82418 = r82409 - r82417;
        double r82419 = 2.0;
        double r82420 = r82419 * r82412;
        double r82421 = r82418 / r82420;
        return r82421;
}

double f(double a, double b, double c) {
        double r82422 = b;
        double r82423 = -1.3696943711263392e-83;
        bool r82424 = r82422 <= r82423;
        double r82425 = -1.0;
        double r82426 = c;
        double r82427 = r82426 / r82422;
        double r82428 = r82425 * r82427;
        double r82429 = 2.678238127073729e+53;
        bool r82430 = r82422 <= r82429;
        double r82431 = cbrt(r82422);
        double r82432 = r82431 * r82431;
        double r82433 = -r82432;
        double r82434 = r82422 * r82422;
        double r82435 = 4.0;
        double r82436 = a;
        double r82437 = r82436 * r82426;
        double r82438 = r82435 * r82437;
        double r82439 = r82434 - r82438;
        double r82440 = sqrt(r82439);
        double r82441 = -r82440;
        double r82442 = fma(r82433, r82431, r82441);
        double r82443 = 2.0;
        double r82444 = r82443 * r82436;
        double r82445 = r82442 / r82444;
        double r82446 = 1.0;
        double r82447 = r82422 / r82436;
        double r82448 = r82427 - r82447;
        double r82449 = r82446 * r82448;
        double r82450 = r82430 ? r82445 : r82449;
        double r82451 = r82424 ? r82428 : r82450;
        return r82451;
}

Error

Bits error versus a

Bits error versus b

Bits error versus c

Target

Original33.8
Target20.8
Herbie10.2
\[\begin{array}{l} \mathbf{if}\;b \lt 0.0:\\ \;\;\;\;\frac{c}{a \cdot \frac{\left(-b\right) + \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}}{2 \cdot a}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\left(-b\right) - \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}}{2 \cdot a}\\ \end{array}\]

Derivation

  1. Split input into 3 regimes
  2. if b < -1.3696943711263392e-83

    1. Initial program 53.2

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

      \[\leadsto \color{blue}{-1 \cdot \frac{c}{b}}\]

    if -1.3696943711263392e-83 < b < 2.678238127073729e+53

    1. Initial program 12.8

      \[\frac{\left(-b\right) - \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}}{2 \cdot a}\]
    2. Using strategy rm
    3. Applied add-cube-cbrt13.0

      \[\leadsto \frac{\left(-\color{blue}{\left(\sqrt[3]{b} \cdot \sqrt[3]{b}\right) \cdot \sqrt[3]{b}}\right) - \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}}{2 \cdot a}\]
    4. Applied distribute-lft-neg-in13.0

      \[\leadsto \frac{\color{blue}{\left(-\sqrt[3]{b} \cdot \sqrt[3]{b}\right) \cdot \sqrt[3]{b}} - \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}}{2 \cdot a}\]
    5. Applied fma-neg13.0

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

    if 2.678238127073729e+53 < b

    1. Initial program 38.1

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

      \[\leadsto \color{blue}{1 \cdot \frac{c}{b} - 1 \cdot \frac{b}{a}}\]
    3. Simplified5.7

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \le -1.369694371126339229257094016308893237032 \cdot 10^{-83}:\\ \;\;\;\;-1 \cdot \frac{c}{b}\\ \mathbf{elif}\;b \le 2.678238127073728805877873599258558355989 \cdot 10^{53}:\\ \;\;\;\;\frac{\mathsf{fma}\left(-\sqrt[3]{b} \cdot \sqrt[3]{b}, \sqrt[3]{b}, -\sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}\right)}{2 \cdot a}\\ \mathbf{else}:\\ \;\;\;\;1 \cdot \left(\frac{c}{b} - \frac{b}{a}\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019362 +o rules:numerics
(FPCore (a b c)
  :name "The quadratic formula (r2)"
  :precision binary64

  :herbie-target
  (if (< b 0.0) (/ c (* a (/ (+ (- b) (sqrt (- (* b b) (* 4 (* a c))))) (* 2 a)))) (/ (- (- b) (sqrt (- (* b b) (* 4 (* a c))))) (* 2 a)))

  (/ (- (- b) (sqrt (- (* b b) (* 4 (* a c))))) (* 2 a)))