Average Error: 34.1 → 10.6
Time: 5.0s
Precision: 64
\[\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}\]
\[\begin{array}{l} \mathbf{if}\;b \le -2.2375225949334019 \cdot 10^{57}:\\ \;\;\;\;1 \cdot \left(\frac{c}{b} - \frac{b}{a}\right)\\ \mathbf{elif}\;b \le 8.67970785211126629 \cdot 10^{-40}:\\ \;\;\;\;\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}\\ \mathbf{else}:\\ \;\;\;\;-1 \cdot \frac{c}{b}\\ \end{array}\]
\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}
\begin{array}{l}
\mathbf{if}\;b \le -2.2375225949334019 \cdot 10^{57}:\\
\;\;\;\;1 \cdot \left(\frac{c}{b} - \frac{b}{a}\right)\\

\mathbf{elif}\;b \le 8.67970785211126629 \cdot 10^{-40}:\\
\;\;\;\;\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}\\

\mathbf{else}:\\
\;\;\;\;-1 \cdot \frac{c}{b}\\

\end{array}
double f(double a, double b, double c) {
        double r60636 = b;
        double r60637 = -r60636;
        double r60638 = r60636 * r60636;
        double r60639 = 4.0;
        double r60640 = a;
        double r60641 = r60639 * r60640;
        double r60642 = c;
        double r60643 = r60641 * r60642;
        double r60644 = r60638 - r60643;
        double r60645 = sqrt(r60644);
        double r60646 = r60637 + r60645;
        double r60647 = 2.0;
        double r60648 = r60647 * r60640;
        double r60649 = r60646 / r60648;
        return r60649;
}

double f(double a, double b, double c) {
        double r60650 = b;
        double r60651 = -2.237522594933402e+57;
        bool r60652 = r60650 <= r60651;
        double r60653 = 1.0;
        double r60654 = c;
        double r60655 = r60654 / r60650;
        double r60656 = a;
        double r60657 = r60650 / r60656;
        double r60658 = r60655 - r60657;
        double r60659 = r60653 * r60658;
        double r60660 = 8.679707852111266e-40;
        bool r60661 = r60650 <= r60660;
        double r60662 = -r60650;
        double r60663 = r60650 * r60650;
        double r60664 = 4.0;
        double r60665 = r60664 * r60656;
        double r60666 = r60665 * r60654;
        double r60667 = r60663 - r60666;
        double r60668 = sqrt(r60667);
        double r60669 = r60662 + r60668;
        double r60670 = 2.0;
        double r60671 = r60670 * r60656;
        double r60672 = r60669 / r60671;
        double r60673 = -1.0;
        double r60674 = r60673 * r60655;
        double r60675 = r60661 ? r60672 : r60674;
        double r60676 = r60652 ? r60659 : r60675;
        return r60676;
}

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

Derivation

  1. Split input into 3 regimes
  2. if b < -2.237522594933402e+57

    1. Initial program 38.1

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

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

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

    if -2.237522594933402e+57 < b < 8.679707852111266e-40

    1. Initial program 15.3

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

    if 8.679707852111266e-40 < b

    1. Initial program 55.1

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \le -2.2375225949334019 \cdot 10^{57}:\\ \;\;\;\;1 \cdot \left(\frac{c}{b} - \frac{b}{a}\right)\\ \mathbf{elif}\;b \le 8.67970785211126629 \cdot 10^{-40}:\\ \;\;\;\;\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}\\ \mathbf{else}:\\ \;\;\;\;-1 \cdot \frac{c}{b}\\ \end{array}\]

Reproduce

herbie shell --seed 2020025 
(FPCore (a b c)
  :name "Quadratic roots, full range"
  :precision binary64
  (/ (+ (- b) (sqrt (- (* b b) (* (* 4 a) c)))) (* 2 a)))