Average Error: 33.0 → 10.9
Time: 21.4s
Precision: 64
\[\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}\]
\[\begin{array}{l} \mathbf{if}\;b \le -9.348931433494438 \cdot 10^{+39}:\\ \;\;\;\;\frac{\left(\frac{c}{b} - \frac{b}{a}\right) \cdot 2}{2}\\ \mathbf{elif}\;b \le 1.3353078790738604 \cdot 10^{-121}:\\ \;\;\;\;\frac{\frac{1}{\frac{a}{\sqrt{\mathsf{fma}\left(b, b, c \cdot \left(-4 \cdot a\right)\right)} - b}}}{2}\\ \mathbf{elif}\;b \le 1.6168702840263923 \cdot 10^{-79}:\\ \;\;\;\;\frac{\frac{c}{b} \cdot -2}{2}\\ \mathbf{elif}\;b \le 1.546013236023957 \cdot 10^{-67}:\\ \;\;\;\;\frac{\frac{1}{a} \cdot \left(\sqrt{\mathsf{fma}\left(b, b, c \cdot \left(-4 \cdot a\right)\right)} - b\right)}{2}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{c}{b} \cdot -2}{2}\\ \end{array}\]
\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}
\begin{array}{l}
\mathbf{if}\;b \le -9.348931433494438 \cdot 10^{+39}:\\
\;\;\;\;\frac{\left(\frac{c}{b} - \frac{b}{a}\right) \cdot 2}{2}\\

\mathbf{elif}\;b \le 1.3353078790738604 \cdot 10^{-121}:\\
\;\;\;\;\frac{\frac{1}{\frac{a}{\sqrt{\mathsf{fma}\left(b, b, c \cdot \left(-4 \cdot a\right)\right)} - b}}}{2}\\

\mathbf{elif}\;b \le 1.6168702840263923 \cdot 10^{-79}:\\
\;\;\;\;\frac{\frac{c}{b} \cdot -2}{2}\\

\mathbf{elif}\;b \le 1.546013236023957 \cdot 10^{-67}:\\
\;\;\;\;\frac{\frac{1}{a} \cdot \left(\sqrt{\mathsf{fma}\left(b, b, c \cdot \left(-4 \cdot a\right)\right)} - b\right)}{2}\\

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

\end{array}
double f(double a, double b, double c) {
        double r2720370 = b;
        double r2720371 = -r2720370;
        double r2720372 = r2720370 * r2720370;
        double r2720373 = 4.0;
        double r2720374 = a;
        double r2720375 = r2720373 * r2720374;
        double r2720376 = c;
        double r2720377 = r2720375 * r2720376;
        double r2720378 = r2720372 - r2720377;
        double r2720379 = sqrt(r2720378);
        double r2720380 = r2720371 + r2720379;
        double r2720381 = 2.0;
        double r2720382 = r2720381 * r2720374;
        double r2720383 = r2720380 / r2720382;
        return r2720383;
}

double f(double a, double b, double c) {
        double r2720384 = b;
        double r2720385 = -9.348931433494438e+39;
        bool r2720386 = r2720384 <= r2720385;
        double r2720387 = c;
        double r2720388 = r2720387 / r2720384;
        double r2720389 = a;
        double r2720390 = r2720384 / r2720389;
        double r2720391 = r2720388 - r2720390;
        double r2720392 = 2.0;
        double r2720393 = r2720391 * r2720392;
        double r2720394 = r2720393 / r2720392;
        double r2720395 = 1.3353078790738604e-121;
        bool r2720396 = r2720384 <= r2720395;
        double r2720397 = 1.0;
        double r2720398 = -4.0;
        double r2720399 = r2720398 * r2720389;
        double r2720400 = r2720387 * r2720399;
        double r2720401 = fma(r2720384, r2720384, r2720400);
        double r2720402 = sqrt(r2720401);
        double r2720403 = r2720402 - r2720384;
        double r2720404 = r2720389 / r2720403;
        double r2720405 = r2720397 / r2720404;
        double r2720406 = r2720405 / r2720392;
        double r2720407 = 1.6168702840263923e-79;
        bool r2720408 = r2720384 <= r2720407;
        double r2720409 = -2.0;
        double r2720410 = r2720388 * r2720409;
        double r2720411 = r2720410 / r2720392;
        double r2720412 = 1.546013236023957e-67;
        bool r2720413 = r2720384 <= r2720412;
        double r2720414 = r2720397 / r2720389;
        double r2720415 = r2720414 * r2720403;
        double r2720416 = r2720415 / r2720392;
        double r2720417 = r2720413 ? r2720416 : r2720411;
        double r2720418 = r2720408 ? r2720411 : r2720417;
        double r2720419 = r2720396 ? r2720406 : r2720418;
        double r2720420 = r2720386 ? r2720394 : r2720419;
        return r2720420;
}

Error

Bits error versus a

Bits error versus b

Bits error versus c

Target

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

Derivation

  1. Split input into 4 regimes
  2. if b < -9.348931433494438e+39

    1. Initial program 34.0

      \[\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}\]
    2. Simplified34.0

      \[\leadsto \color{blue}{\frac{\frac{\sqrt{\mathsf{fma}\left(b, b, \left(a \cdot -4\right) \cdot c\right)} - b}{a}}{2}}\]
    3. Using strategy rm
    4. Applied div-inv34.1

      \[\leadsto \frac{\color{blue}{\left(\sqrt{\mathsf{fma}\left(b, b, \left(a \cdot -4\right) \cdot c\right)} - b\right) \cdot \frac{1}{a}}}{2}\]
    5. Taylor expanded around -inf 6.2

      \[\leadsto \frac{\color{blue}{2 \cdot \frac{c}{b} - 2 \cdot \frac{b}{a}}}{2}\]
    6. Simplified6.2

      \[\leadsto \frac{\color{blue}{2 \cdot \left(\frac{c}{b} - \frac{b}{a}\right)}}{2}\]

    if -9.348931433494438e+39 < b < 1.3353078790738604e-121

    1. Initial program 12.2

      \[\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}\]
    2. Simplified12.2

      \[\leadsto \color{blue}{\frac{\frac{\sqrt{\mathsf{fma}\left(b, b, \left(a \cdot -4\right) \cdot c\right)} - b}{a}}{2}}\]
    3. Using strategy rm
    4. Applied clear-num12.3

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

    if 1.3353078790738604e-121 < b < 1.6168702840263923e-79 or 1.546013236023957e-67 < b

    1. Initial program 50.8

      \[\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}\]
    2. Simplified50.8

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

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

    if 1.6168702840263923e-79 < b < 1.546013236023957e-67

    1. Initial program 35.8

      \[\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}\]
    2. Simplified35.8

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \le -9.348931433494438 \cdot 10^{+39}:\\ \;\;\;\;\frac{\left(\frac{c}{b} - \frac{b}{a}\right) \cdot 2}{2}\\ \mathbf{elif}\;b \le 1.3353078790738604 \cdot 10^{-121}:\\ \;\;\;\;\frac{\frac{1}{\frac{a}{\sqrt{\mathsf{fma}\left(b, b, c \cdot \left(-4 \cdot a\right)\right)} - b}}}{2}\\ \mathbf{elif}\;b \le 1.6168702840263923 \cdot 10^{-79}:\\ \;\;\;\;\frac{\frac{c}{b} \cdot -2}{2}\\ \mathbf{elif}\;b \le 1.546013236023957 \cdot 10^{-67}:\\ \;\;\;\;\frac{\frac{1}{a} \cdot \left(\sqrt{\mathsf{fma}\left(b, b, c \cdot \left(-4 \cdot a\right)\right)} - b\right)}{2}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{c}{b} \cdot -2}{2}\\ \end{array}\]

Reproduce

herbie shell --seed 2019158 +o rules:numerics
(FPCore (a b c)
  :name "The quadratic formula (r1)"

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

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