Average Error: 34.0 → 9.3
Time: 7.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 -8.5069461462218695 \cdot 10^{125}:\\ \;\;\;\;1 \cdot \left(\frac{c}{b} - \frac{b}{a}\right)\\ \mathbf{elif}\;b \le 2.2742398392973687 \cdot 10^{-86}:\\ \;\;\;\;\left(\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}\right) \cdot \frac{1}{2 \cdot a}\\ \mathbf{elif}\;b \le 9.16799708835065593 \cdot 10^{-7}:\\ \;\;\;\;\frac{\frac{0 + 4 \cdot \left(a \cdot c\right)}{\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 -8.5069461462218695 \cdot 10^{125}:\\
\;\;\;\;1 \cdot \left(\frac{c}{b} - \frac{b}{a}\right)\\

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

\mathbf{elif}\;b \le 9.16799708835065593 \cdot 10^{-7}:\\
\;\;\;\;\frac{\frac{0 + 4 \cdot \left(a \cdot c\right)}{\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 r65005 = b;
        double r65006 = -r65005;
        double r65007 = r65005 * r65005;
        double r65008 = 4.0;
        double r65009 = a;
        double r65010 = r65008 * r65009;
        double r65011 = c;
        double r65012 = r65010 * r65011;
        double r65013 = r65007 - r65012;
        double r65014 = sqrt(r65013);
        double r65015 = r65006 + r65014;
        double r65016 = 2.0;
        double r65017 = r65016 * r65009;
        double r65018 = r65015 / r65017;
        return r65018;
}

double f(double a, double b, double c) {
        double r65019 = b;
        double r65020 = -8.50694614622187e+125;
        bool r65021 = r65019 <= r65020;
        double r65022 = 1.0;
        double r65023 = c;
        double r65024 = r65023 / r65019;
        double r65025 = a;
        double r65026 = r65019 / r65025;
        double r65027 = r65024 - r65026;
        double r65028 = r65022 * r65027;
        double r65029 = 2.2742398392973687e-86;
        bool r65030 = r65019 <= r65029;
        double r65031 = -r65019;
        double r65032 = r65019 * r65019;
        double r65033 = 4.0;
        double r65034 = r65033 * r65025;
        double r65035 = r65034 * r65023;
        double r65036 = r65032 - r65035;
        double r65037 = sqrt(r65036);
        double r65038 = r65031 + r65037;
        double r65039 = 1.0;
        double r65040 = 2.0;
        double r65041 = r65040 * r65025;
        double r65042 = r65039 / r65041;
        double r65043 = r65038 * r65042;
        double r65044 = 9.167997088350656e-07;
        bool r65045 = r65019 <= r65044;
        double r65046 = 0.0;
        double r65047 = r65025 * r65023;
        double r65048 = r65033 * r65047;
        double r65049 = r65046 + r65048;
        double r65050 = r65031 - r65037;
        double r65051 = r65049 / r65050;
        double r65052 = r65051 / r65041;
        double r65053 = -1.0;
        double r65054 = r65053 * r65024;
        double r65055 = r65045 ? r65052 : r65054;
        double r65056 = r65030 ? r65043 : r65055;
        double r65057 = r65021 ? r65028 : r65056;
        return r65057;
}

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 4 regimes
  2. if b < -8.50694614622187e+125

    1. Initial program 53.3

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

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

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

    if -8.50694614622187e+125 < b < 2.2742398392973687e-86

    1. Initial program 12.3

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

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

    if 2.2742398392973687e-86 < b < 9.167997088350656e-07

    1. Initial program 38.3

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

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

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

    if 9.167997088350656e-07 < b

    1. Initial program 55.8

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \le -8.5069461462218695 \cdot 10^{125}:\\ \;\;\;\;1 \cdot \left(\frac{c}{b} - \frac{b}{a}\right)\\ \mathbf{elif}\;b \le 2.2742398392973687 \cdot 10^{-86}:\\ \;\;\;\;\left(\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}\right) \cdot \frac{1}{2 \cdot a}\\ \mathbf{elif}\;b \le 9.16799708835065593 \cdot 10^{-7}:\\ \;\;\;\;\frac{\frac{0 + 4 \cdot \left(a \cdot c\right)}{\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 2020003 +o rules:numerics
(FPCore (a b c)
  :name "Quadratic roots, full range"
  :precision binary64
  (/ (+ (- b) (sqrt (- (* b b) (* (* 4 a) c)))) (* 2 a)))