Average Error: 34.1 → 10.1
Time: 40.1s
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 -4.32337788234514 \cdot 10^{-89}:\\ \;\;\;\;-\frac{c}{b}\\ \mathbf{elif}\;b \le 1.4404833532724588 \cdot 10^{+150}:\\ \;\;\;\;\frac{1}{\frac{\frac{a}{\frac{1}{2}}}{-\left(\sqrt{\mathsf{fma}\left(-4, c \cdot a, b \cdot b\right)} + b\right)}}\\ \mathbf{else}:\\ \;\;\;\;\left(2 \cdot \left(\frac{a}{\frac{b}{c}} - b\right)\right) \cdot \frac{\frac{1}{2}}{a}\\ \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 -4.32337788234514 \cdot 10^{-89}:\\
\;\;\;\;-\frac{c}{b}\\

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

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

\end{array}
double f(double a, double b, double c) {
        double r3013126 = b;
        double r3013127 = -r3013126;
        double r3013128 = r3013126 * r3013126;
        double r3013129 = 4.0;
        double r3013130 = a;
        double r3013131 = c;
        double r3013132 = r3013130 * r3013131;
        double r3013133 = r3013129 * r3013132;
        double r3013134 = r3013128 - r3013133;
        double r3013135 = sqrt(r3013134);
        double r3013136 = r3013127 - r3013135;
        double r3013137 = 2.0;
        double r3013138 = r3013137 * r3013130;
        double r3013139 = r3013136 / r3013138;
        return r3013139;
}

double f(double a, double b, double c) {
        double r3013140 = b;
        double r3013141 = -4.32337788234514e-89;
        bool r3013142 = r3013140 <= r3013141;
        double r3013143 = c;
        double r3013144 = r3013143 / r3013140;
        double r3013145 = -r3013144;
        double r3013146 = 1.4404833532724588e+150;
        bool r3013147 = r3013140 <= r3013146;
        double r3013148 = 1.0;
        double r3013149 = a;
        double r3013150 = 0.5;
        double r3013151 = r3013149 / r3013150;
        double r3013152 = -4.0;
        double r3013153 = r3013143 * r3013149;
        double r3013154 = r3013140 * r3013140;
        double r3013155 = fma(r3013152, r3013153, r3013154);
        double r3013156 = sqrt(r3013155);
        double r3013157 = r3013156 + r3013140;
        double r3013158 = -r3013157;
        double r3013159 = r3013151 / r3013158;
        double r3013160 = r3013148 / r3013159;
        double r3013161 = 2.0;
        double r3013162 = r3013140 / r3013143;
        double r3013163 = r3013149 / r3013162;
        double r3013164 = r3013163 - r3013140;
        double r3013165 = r3013161 * r3013164;
        double r3013166 = r3013150 / r3013149;
        double r3013167 = r3013165 * r3013166;
        double r3013168 = r3013147 ? r3013160 : r3013167;
        double r3013169 = r3013142 ? r3013145 : r3013168;
        return r3013169;
}

Error

Bits error versus a

Bits error versus b

Bits error versus c

Target

Original34.1
Target21.0
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 < -4.32337788234514e-89

    1. Initial program 52.3

      \[\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-inv52.3

      \[\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. Simplified52.3

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

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

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

    if -4.32337788234514e-89 < b < 1.4404833532724588e+150

    1. Initial program 12.3

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

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

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

    if 1.4404833532724588e+150 < b

    1. Initial program 59.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-inv59.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. Simplified59.4

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

      \[\leadsto \color{blue}{\left(2 \cdot \frac{a \cdot c}{b} - 2 \cdot b\right)} \cdot \frac{\frac{1}{2}}{a}\]
    6. Simplified3.0

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

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

Reproduce

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