Average Error: 33.7 → 10.1
Time: 18.3s
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 -7.406397712303184 \cdot 10^{-53}:\\ \;\;\;\;\frac{-2 \cdot \frac{c}{b}}{2}\\ \mathbf{elif}\;b \le 2.9822108876570007 \cdot 10^{+66}:\\ \;\;\;\;-\frac{\frac{\sqrt{\mathsf{fma}\left(c, -4 \cdot a, b \cdot b\right)} + b}{a}}{2}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{b}{a} \cdot -2}{2}\\ \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 -7.406397712303184 \cdot 10^{-53}:\\
\;\;\;\;\frac{-2 \cdot \frac{c}{b}}{2}\\

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

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

\end{array}
double f(double a, double b, double c) {
        double r1365809 = b;
        double r1365810 = -r1365809;
        double r1365811 = r1365809 * r1365809;
        double r1365812 = 4.0;
        double r1365813 = a;
        double r1365814 = c;
        double r1365815 = r1365813 * r1365814;
        double r1365816 = r1365812 * r1365815;
        double r1365817 = r1365811 - r1365816;
        double r1365818 = sqrt(r1365817);
        double r1365819 = r1365810 - r1365818;
        double r1365820 = 2.0;
        double r1365821 = r1365820 * r1365813;
        double r1365822 = r1365819 / r1365821;
        return r1365822;
}

double f(double a, double b, double c) {
        double r1365823 = b;
        double r1365824 = -7.406397712303184e-53;
        bool r1365825 = r1365823 <= r1365824;
        double r1365826 = -2.0;
        double r1365827 = c;
        double r1365828 = r1365827 / r1365823;
        double r1365829 = r1365826 * r1365828;
        double r1365830 = 2.0;
        double r1365831 = r1365829 / r1365830;
        double r1365832 = 2.9822108876570007e+66;
        bool r1365833 = r1365823 <= r1365832;
        double r1365834 = -4.0;
        double r1365835 = a;
        double r1365836 = r1365834 * r1365835;
        double r1365837 = r1365823 * r1365823;
        double r1365838 = fma(r1365827, r1365836, r1365837);
        double r1365839 = sqrt(r1365838);
        double r1365840 = r1365839 + r1365823;
        double r1365841 = r1365840 / r1365835;
        double r1365842 = r1365841 / r1365830;
        double r1365843 = -r1365842;
        double r1365844 = r1365823 / r1365835;
        double r1365845 = r1365844 * r1365826;
        double r1365846 = r1365845 / r1365830;
        double r1365847 = r1365833 ? r1365843 : r1365846;
        double r1365848 = r1365825 ? r1365831 : r1365847;
        return r1365848;
}

Error

Bits error versus a

Bits error versus b

Bits error versus c

Target

Original33.7
Target20.7
Herbie10.1
\[\begin{array}{l} \mathbf{if}\;b \lt 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 < -7.406397712303184e-53

    1. Initial program 53.9

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

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

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

    if -7.406397712303184e-53 < b < 2.9822108876570007e+66

    1. Initial program 13.9

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

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

      \[\leadsto \frac{\color{blue}{\left(\left(-b\right) - \sqrt{\mathsf{fma}\left(-4 \cdot a, c, b \cdot b\right)}\right) \cdot \frac{1}{a}}}{2}\]
    5. Using strategy rm
    6. Applied associate-*r/13.9

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

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

    if 2.9822108876570007e+66 < b

    1. Initial program 38.4

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

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

      \[\leadsto \frac{\color{blue}{\left(\left(-b\right) - \sqrt{\mathsf{fma}\left(-4 \cdot a, c, b \cdot b\right)}\right) \cdot \frac{1}{a}}}{2}\]
    5. Using strategy rm
    6. Applied associate-*r/38.4

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

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

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

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

Reproduce

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

  :herbie-target
  (if (< b 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)))