Average Error: 33.5 → 10.3
Time: 3.3m
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 -9.238052366259206 \cdot 10^{-38}:\\ \;\;\;\;-\frac{c}{b}\\ \mathbf{elif}\;b \le 2.7654658503846575 \cdot 10^{+109}:\\ \;\;\;\;\frac{\frac{-1}{2}}{a} \cdot \left(\sqrt{(a \cdot \left(c \cdot -4\right) + \left(b \cdot b\right))_*} + b\right)\\ \mathbf{else}:\\ \;\;\;\;-\frac{b}{a}\\ \end{array}\]
double f(double a, double b, double c) {
        double r10636008 = b;
        double r10636009 = -r10636008;
        double r10636010 = r10636008 * r10636008;
        double r10636011 = 4.0;
        double r10636012 = a;
        double r10636013 = c;
        double r10636014 = r10636012 * r10636013;
        double r10636015 = r10636011 * r10636014;
        double r10636016 = r10636010 - r10636015;
        double r10636017 = sqrt(r10636016);
        double r10636018 = r10636009 - r10636017;
        double r10636019 = 2.0;
        double r10636020 = r10636019 * r10636012;
        double r10636021 = r10636018 / r10636020;
        return r10636021;
}

double f(double a, double b, double c) {
        double r10636022 = b;
        double r10636023 = -9.238052366259206e-38;
        bool r10636024 = r10636022 <= r10636023;
        double r10636025 = c;
        double r10636026 = r10636025 / r10636022;
        double r10636027 = -r10636026;
        double r10636028 = 2.7654658503846575e+109;
        bool r10636029 = r10636022 <= r10636028;
        double r10636030 = -0.5;
        double r10636031 = a;
        double r10636032 = r10636030 / r10636031;
        double r10636033 = -4.0;
        double r10636034 = r10636025 * r10636033;
        double r10636035 = r10636022 * r10636022;
        double r10636036 = fma(r10636031, r10636034, r10636035);
        double r10636037 = sqrt(r10636036);
        double r10636038 = r10636037 + r10636022;
        double r10636039 = r10636032 * r10636038;
        double r10636040 = r10636022 / r10636031;
        double r10636041 = -r10636040;
        double r10636042 = r10636029 ? r10636039 : r10636041;
        double r10636043 = r10636024 ? r10636027 : r10636042;
        return r10636043;
}

\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 -9.238052366259206 \cdot 10^{-38}:\\
\;\;\;\;-\frac{c}{b}\\

\mathbf{elif}\;b \le 2.7654658503846575 \cdot 10^{+109}:\\
\;\;\;\;\frac{\frac{-1}{2}}{a} \cdot \left(\sqrt{(a \cdot \left(c \cdot -4\right) + \left(b \cdot b\right))_*} + b\right)\\

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

\end{array}

Error

Bits error versus a

Bits error versus b

Bits error versus c

Target

Original33.5
Target20.8
Herbie10.3
\[\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 < -9.238052366259206e-38

    1. Initial program 53.5

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

      \[\leadsto \color{blue}{\frac{\frac{\left(-b\right) - \sqrt{(\left(a \cdot c\right) \cdot -4 + \left(b \cdot b\right))_*}}{2}}{a}}\]
    3. Taylor expanded around -inf 7.8

      \[\leadsto \color{blue}{-1 \cdot \frac{c}{b}}\]
    4. Simplified7.8

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

    if -9.238052366259206e-38 < b < 2.7654658503846575e+109

    1. Initial program 14.2

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

      \[\leadsto \color{blue}{\frac{\frac{\left(-b\right) - \sqrt{(\left(a \cdot c\right) \cdot -4 + \left(b \cdot b\right))_*}}{2}}{a}}\]
    3. Using strategy rm
    4. Applied *-un-lft-identity14.2

      \[\leadsto \frac{\frac{\left(-b\right) - \sqrt{(\left(a \cdot c\right) \cdot -4 + \left(b \cdot b\right))_*}}{2}}{\color{blue}{1 \cdot a}}\]
    5. Applied div-inv14.2

      \[\leadsto \frac{\color{blue}{\left(\left(-b\right) - \sqrt{(\left(a \cdot c\right) \cdot -4 + \left(b \cdot b\right))_*}\right) \cdot \frac{1}{2}}}{1 \cdot a}\]
    6. Applied times-frac14.3

      \[\leadsto \color{blue}{\frac{\left(-b\right) - \sqrt{(\left(a \cdot c\right) \cdot -4 + \left(b \cdot b\right))_*}}{1} \cdot \frac{\frac{1}{2}}{a}}\]
    7. Simplified14.4

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

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

    if 2.7654658503846575e+109 < b

    1. Initial program 47.4

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

      \[\leadsto \color{blue}{\frac{\frac{\left(-b\right) - \sqrt{(\left(a \cdot c\right) \cdot -4 + \left(b \cdot b\right))_*}}{2}}{a}}\]
    3. Using strategy rm
    4. Applied clear-num47.5

      \[\leadsto \color{blue}{\frac{1}{\frac{a}{\frac{\left(-b\right) - \sqrt{(\left(a \cdot c\right) \cdot -4 + \left(b \cdot b\right))_*}}{2}}}}\]
    5. Taylor expanded around 0 3.4

      \[\leadsto \color{blue}{-1 \cdot \frac{b}{a}}\]
    6. Simplified3.4

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \le -9.238052366259206 \cdot 10^{-38}:\\ \;\;\;\;-\frac{c}{b}\\ \mathbf{elif}\;b \le 2.7654658503846575 \cdot 10^{+109}:\\ \;\;\;\;\frac{\frac{-1}{2}}{a} \cdot \left(\sqrt{(a \cdot \left(c \cdot -4\right) + \left(b \cdot b\right))_*} + b\right)\\ \mathbf{else}:\\ \;\;\;\;-\frac{b}{a}\\ \end{array}\]

Reproduce

herbie shell --seed 2019102 +o rules:numerics
(FPCore (a b c)
  :name "quadm (p42, negative)"

  :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)))