Average Error: 34.3 → 10.4
Time: 17.5s
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.075953179536434403809045843723111238623 \cdot 10^{-63}:\\ \;\;\;\;-1 \cdot \frac{c}{b}\\ \mathbf{elif}\;b \le 2000198799923726.5:\\ \;\;\;\;\frac{\frac{\left(-b\right) - \sqrt{\mathsf{fma}\left(b, b, -\left(a \cdot c\right) \cdot 4\right)}}{2}}{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.075953179536434403809045843723111238623 \cdot 10^{-63}:\\
\;\;\;\;-1 \cdot \frac{c}{b}\\

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

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

\end{array}
double f(double a, double b, double c) {
        double r92312 = b;
        double r92313 = -r92312;
        double r92314 = r92312 * r92312;
        double r92315 = 4.0;
        double r92316 = a;
        double r92317 = c;
        double r92318 = r92316 * r92317;
        double r92319 = r92315 * r92318;
        double r92320 = r92314 - r92319;
        double r92321 = sqrt(r92320);
        double r92322 = r92313 - r92321;
        double r92323 = 2.0;
        double r92324 = r92323 * r92316;
        double r92325 = r92322 / r92324;
        return r92325;
}

double f(double a, double b, double c) {
        double r92326 = b;
        double r92327 = -1.0759531795364344e-63;
        bool r92328 = r92326 <= r92327;
        double r92329 = -1.0;
        double r92330 = c;
        double r92331 = r92330 / r92326;
        double r92332 = r92329 * r92331;
        double r92333 = 2000198799923726.5;
        bool r92334 = r92326 <= r92333;
        double r92335 = -r92326;
        double r92336 = a;
        double r92337 = r92336 * r92330;
        double r92338 = 4.0;
        double r92339 = r92337 * r92338;
        double r92340 = -r92339;
        double r92341 = fma(r92326, r92326, r92340);
        double r92342 = sqrt(r92341);
        double r92343 = r92335 - r92342;
        double r92344 = 2.0;
        double r92345 = r92343 / r92344;
        double r92346 = r92345 / r92336;
        double r92347 = 1.0;
        double r92348 = r92326 / r92336;
        double r92349 = r92331 - r92348;
        double r92350 = r92347 * r92349;
        double r92351 = r92334 ? r92346 : r92350;
        double r92352 = r92328 ? r92332 : r92351;
        return r92352;
}

Error

Bits error versus a

Bits error versus b

Bits error versus c

Target

Original34.3
Target20.9
Herbie10.4
\[\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.0759531795364344e-63

    1. Initial program 54.4

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

      \[\leadsto \color{blue}{\left(\left(-b\right) - \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}\right) \cdot \frac{1}{2 \cdot a}}\]
    4. Using strategy rm
    5. Applied pow154.4

      \[\leadsto \left(\left(-b\right) - \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}\right) \cdot \color{blue}{{\left(\frac{1}{2 \cdot a}\right)}^{1}}\]
    6. Applied pow154.4

      \[\leadsto \color{blue}{{\left(\left(-b\right) - \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}\right)}^{1}} \cdot {\left(\frac{1}{2 \cdot a}\right)}^{1}\]
    7. Applied pow-prod-down54.4

      \[\leadsto \color{blue}{{\left(\left(\left(-b\right) - \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}\right) \cdot \frac{1}{2 \cdot a}\right)}^{1}}\]
    8. Simplified54.4

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

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

    if -1.0759531795364344e-63 < b < 2000198799923726.5

    1. Initial program 14.9

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

      \[\leadsto \color{blue}{\left(\left(-b\right) - \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}\right) \cdot \frac{1}{2 \cdot a}}\]
    4. Using strategy rm
    5. Applied pow115.0

      \[\leadsto \left(\left(-b\right) - \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}\right) \cdot \color{blue}{{\left(\frac{1}{2 \cdot a}\right)}^{1}}\]
    6. Applied pow115.0

      \[\leadsto \color{blue}{{\left(\left(-b\right) - \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}\right)}^{1}} \cdot {\left(\frac{1}{2 \cdot a}\right)}^{1}\]
    7. Applied pow-prod-down15.0

      \[\leadsto \color{blue}{{\left(\left(\left(-b\right) - \sqrt{b \cdot b - 4 \cdot \left(a \cdot c\right)}\right) \cdot \frac{1}{2 \cdot a}\right)}^{1}}\]
    8. Simplified14.9

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

    if 2000198799923726.5 < b

    1. Initial program 34.0

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

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

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

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

Reproduce

herbie shell --seed 2019208 +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)))