Average Error: 34.4 → 8.4
Time: 44.7s
Precision: 64
\[\frac{\left(-b\right) - \sqrt{b \cdot b - 4.0 \cdot \left(a \cdot c\right)}}{2.0 \cdot a}\]
\[\begin{array}{l} \mathbf{if}\;b \le -3.234164035284793 \cdot 10^{+22}:\\ \;\;\;\;-1.0 \cdot \frac{c}{b}\\ \mathbf{elif}\;b \le -2.4242286502051438 \cdot 10^{-135}:\\ \;\;\;\;\frac{\frac{\left(b \cdot b - b \cdot b\right) + 4.0 \cdot \left(c \cdot a\right)}{\sqrt{b \cdot b - 4.0 \cdot \left(c \cdot a\right)} - b}}{2.0 \cdot a}\\ \mathbf{elif}\;b \le 1.7205132563858266 \cdot 10^{+103}:\\ \;\;\;\;\frac{1}{2.0 \cdot a} \cdot \left(\left(-b\right) - \sqrt{b \cdot b - 4.0 \cdot \left(c \cdot a\right)}\right)\\ \mathbf{else}:\\ \;\;\;\;\left(\frac{c}{b} - \frac{b}{a}\right) \cdot 1.0\\ \end{array}\]
\frac{\left(-b\right) - \sqrt{b \cdot b - 4.0 \cdot \left(a \cdot c\right)}}{2.0 \cdot a}
\begin{array}{l}
\mathbf{if}\;b \le -3.234164035284793 \cdot 10^{+22}:\\
\;\;\;\;-1.0 \cdot \frac{c}{b}\\

\mathbf{elif}\;b \le -2.4242286502051438 \cdot 10^{-135}:\\
\;\;\;\;\frac{\frac{\left(b \cdot b - b \cdot b\right) + 4.0 \cdot \left(c \cdot a\right)}{\sqrt{b \cdot b - 4.0 \cdot \left(c \cdot a\right)} - b}}{2.0 \cdot a}\\

\mathbf{elif}\;b \le 1.7205132563858266 \cdot 10^{+103}:\\
\;\;\;\;\frac{1}{2.0 \cdot a} \cdot \left(\left(-b\right) - \sqrt{b \cdot b - 4.0 \cdot \left(c \cdot a\right)}\right)\\

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

\end{array}
double f(double a, double b, double c) {
        double r4380252 = b;
        double r4380253 = -r4380252;
        double r4380254 = r4380252 * r4380252;
        double r4380255 = 4.0;
        double r4380256 = a;
        double r4380257 = c;
        double r4380258 = r4380256 * r4380257;
        double r4380259 = r4380255 * r4380258;
        double r4380260 = r4380254 - r4380259;
        double r4380261 = sqrt(r4380260);
        double r4380262 = r4380253 - r4380261;
        double r4380263 = 2.0;
        double r4380264 = r4380263 * r4380256;
        double r4380265 = r4380262 / r4380264;
        return r4380265;
}

double f(double a, double b, double c) {
        double r4380266 = b;
        double r4380267 = -3.234164035284793e+22;
        bool r4380268 = r4380266 <= r4380267;
        double r4380269 = -1.0;
        double r4380270 = c;
        double r4380271 = r4380270 / r4380266;
        double r4380272 = r4380269 * r4380271;
        double r4380273 = -2.4242286502051438e-135;
        bool r4380274 = r4380266 <= r4380273;
        double r4380275 = r4380266 * r4380266;
        double r4380276 = r4380275 - r4380275;
        double r4380277 = 4.0;
        double r4380278 = a;
        double r4380279 = r4380270 * r4380278;
        double r4380280 = r4380277 * r4380279;
        double r4380281 = r4380276 + r4380280;
        double r4380282 = r4380275 - r4380280;
        double r4380283 = sqrt(r4380282);
        double r4380284 = r4380283 - r4380266;
        double r4380285 = r4380281 / r4380284;
        double r4380286 = 2.0;
        double r4380287 = r4380286 * r4380278;
        double r4380288 = r4380285 / r4380287;
        double r4380289 = 1.7205132563858266e+103;
        bool r4380290 = r4380266 <= r4380289;
        double r4380291 = 1.0;
        double r4380292 = r4380291 / r4380287;
        double r4380293 = -r4380266;
        double r4380294 = r4380293 - r4380283;
        double r4380295 = r4380292 * r4380294;
        double r4380296 = r4380266 / r4380278;
        double r4380297 = r4380271 - r4380296;
        double r4380298 = 1.0;
        double r4380299 = r4380297 * r4380298;
        double r4380300 = r4380290 ? r4380295 : r4380299;
        double r4380301 = r4380274 ? r4380288 : r4380300;
        double r4380302 = r4380268 ? r4380272 : r4380301;
        return r4380302;
}

Error

Bits error versus a

Bits error versus b

Bits error versus c

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original34.4
Target21.3
Herbie8.4
\[\begin{array}{l} \mathbf{if}\;b \lt 0.0:\\ \;\;\;\;\frac{c}{a \cdot \frac{\left(-b\right) + \sqrt{b \cdot b - 4.0 \cdot \left(a \cdot c\right)}}{2.0 \cdot a}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\left(-b\right) - \sqrt{b \cdot b - 4.0 \cdot \left(a \cdot c\right)}}{2.0 \cdot a}\\ \end{array}\]

Derivation

  1. Split input into 4 regimes
  2. if b < -3.234164035284793e+22

    1. Initial program 56.6

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

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

    if -3.234164035284793e+22 < b < -2.4242286502051438e-135

    1. Initial program 36.3

      \[\frac{\left(-b\right) - \sqrt{b \cdot b - 4.0 \cdot \left(a \cdot c\right)}}{2.0 \cdot a}\]
    2. Using strategy rm
    3. Applied flip--36.4

      \[\leadsto \frac{\color{blue}{\frac{\left(-b\right) \cdot \left(-b\right) - \sqrt{b \cdot b - 4.0 \cdot \left(a \cdot c\right)} \cdot \sqrt{b \cdot b - 4.0 \cdot \left(a \cdot c\right)}}{\left(-b\right) + \sqrt{b \cdot b - 4.0 \cdot \left(a \cdot c\right)}}}}{2.0 \cdot a}\]
    4. Simplified16.2

      \[\leadsto \frac{\frac{\color{blue}{\left(b \cdot b - b \cdot b\right) + 4.0 \cdot \left(a \cdot c\right)}}{\left(-b\right) + \sqrt{b \cdot b - 4.0 \cdot \left(a \cdot c\right)}}}{2.0 \cdot a}\]
    5. Simplified16.2

      \[\leadsto \frac{\frac{\left(b \cdot b - b \cdot b\right) + 4.0 \cdot \left(a \cdot c\right)}{\color{blue}{\sqrt{b \cdot b - 4.0 \cdot \left(a \cdot c\right)} - b}}}{2.0 \cdot a}\]

    if -2.4242286502051438e-135 < b < 1.7205132563858266e+103

    1. Initial program 11.0

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

      \[\leadsto \color{blue}{\left(\left(-b\right) - \sqrt{b \cdot b - 4.0 \cdot \left(a \cdot c\right)}\right) \cdot \frac{1}{2.0 \cdot a}}\]

    if 1.7205132563858266e+103 < b

    1. Initial program 47.4

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

      \[\leadsto \color{blue}{1.0 \cdot \frac{c}{b} - 1.0 \cdot \frac{b}{a}}\]
    3. Simplified3.2

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \le -3.234164035284793 \cdot 10^{+22}:\\ \;\;\;\;-1.0 \cdot \frac{c}{b}\\ \mathbf{elif}\;b \le -2.4242286502051438 \cdot 10^{-135}:\\ \;\;\;\;\frac{\frac{\left(b \cdot b - b \cdot b\right) + 4.0 \cdot \left(c \cdot a\right)}{\sqrt{b \cdot b - 4.0 \cdot \left(c \cdot a\right)} - b}}{2.0 \cdot a}\\ \mathbf{elif}\;b \le 1.7205132563858266 \cdot 10^{+103}:\\ \;\;\;\;\frac{1}{2.0 \cdot a} \cdot \left(\left(-b\right) - \sqrt{b \cdot b - 4.0 \cdot \left(c \cdot a\right)}\right)\\ \mathbf{else}:\\ \;\;\;\;\left(\frac{c}{b} - \frac{b}{a}\right) \cdot 1.0\\ \end{array}\]

Reproduce

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

  :herbie-target
  (if (< b 0.0) (/ c (* a (/ (+ (- b) (sqrt (- (* b b) (* 4.0 (* a c))))) (* 2.0 a)))) (/ (- (- b) (sqrt (- (* b b) (* 4.0 (* a c))))) (* 2.0 a)))

  (/ (- (- b) (sqrt (- (* b b) (* 4.0 (* a c))))) (* 2.0 a)))