Average Error: 19.6 → 13.7
Time: 19.0s
Precision: 64
\[\begin{array}{l} \mathbf{if}\;b \ge 0.0:\\ \;\;\;\;\frac{2 \cdot c}{\left(-b\right) - \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}\\ \end{array}\]
\[\begin{array}{l} \mathbf{if}\;b \le 3.628799960716311990444092539387346352569 \cdot 10^{50}:\\ \;\;\;\;\begin{array}{l} \mathbf{if}\;b \ge 0.0:\\ \;\;\;\;\frac{2 \cdot c}{\left(-b\right) - \sqrt{\mathsf{fma}\left(4 \cdot c, -a, b \cdot b\right)}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{\sqrt{\sqrt{\mathsf{fma}\left(4 \cdot c, -a, b \cdot b\right)} - b} \cdot \sqrt{\sqrt{\mathsf{fma}\left(4 \cdot c, -a, b \cdot b\right)} - b}}{2}}{a}\\ \end{array}\\ \mathbf{elif}\;b \ge 0.0:\\ \;\;\;\;\frac{2 \cdot c}{\left(-b\right) - b}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{\sqrt{\mathsf{fma}\left(4 \cdot c, -a, b \cdot b\right)} - b}{2}}{a}\\ \end{array}\]
\begin{array}{l}
\mathbf{if}\;b \ge 0.0:\\
\;\;\;\;\frac{2 \cdot c}{\left(-b\right) - \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}\\

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

\end{array}
\begin{array}{l}
\mathbf{if}\;b \le 3.628799960716311990444092539387346352569 \cdot 10^{50}:\\
\;\;\;\;\begin{array}{l}
\mathbf{if}\;b \ge 0.0:\\
\;\;\;\;\frac{2 \cdot c}{\left(-b\right) - \sqrt{\mathsf{fma}\left(4 \cdot c, -a, b \cdot b\right)}}\\

\mathbf{else}:\\
\;\;\;\;\frac{\frac{\sqrt{\sqrt{\mathsf{fma}\left(4 \cdot c, -a, b \cdot b\right)} - b} \cdot \sqrt{\sqrt{\mathsf{fma}\left(4 \cdot c, -a, b \cdot b\right)} - b}}{2}}{a}\\

\end{array}\\

\mathbf{elif}\;b \ge 0.0:\\
\;\;\;\;\frac{2 \cdot c}{\left(-b\right) - b}\\

\mathbf{else}:\\
\;\;\;\;\frac{\frac{\sqrt{\mathsf{fma}\left(4 \cdot c, -a, b \cdot b\right)} - b}{2}}{a}\\

\end{array}
double f(double a, double b, double c) {
        double r36784 = b;
        double r36785 = 0.0;
        bool r36786 = r36784 >= r36785;
        double r36787 = 2.0;
        double r36788 = c;
        double r36789 = r36787 * r36788;
        double r36790 = -r36784;
        double r36791 = r36784 * r36784;
        double r36792 = 4.0;
        double r36793 = a;
        double r36794 = r36792 * r36793;
        double r36795 = r36794 * r36788;
        double r36796 = r36791 - r36795;
        double r36797 = sqrt(r36796);
        double r36798 = r36790 - r36797;
        double r36799 = r36789 / r36798;
        double r36800 = r36790 + r36797;
        double r36801 = r36787 * r36793;
        double r36802 = r36800 / r36801;
        double r36803 = r36786 ? r36799 : r36802;
        return r36803;
}

double f(double a, double b, double c) {
        double r36804 = b;
        double r36805 = 3.628799960716312e+50;
        bool r36806 = r36804 <= r36805;
        double r36807 = 0.0;
        bool r36808 = r36804 >= r36807;
        double r36809 = 2.0;
        double r36810 = c;
        double r36811 = r36809 * r36810;
        double r36812 = -r36804;
        double r36813 = 4.0;
        double r36814 = r36813 * r36810;
        double r36815 = a;
        double r36816 = -r36815;
        double r36817 = r36804 * r36804;
        double r36818 = fma(r36814, r36816, r36817);
        double r36819 = sqrt(r36818);
        double r36820 = r36812 - r36819;
        double r36821 = r36811 / r36820;
        double r36822 = r36819 - r36804;
        double r36823 = sqrt(r36822);
        double r36824 = r36823 * r36823;
        double r36825 = r36824 / r36809;
        double r36826 = r36825 / r36815;
        double r36827 = r36808 ? r36821 : r36826;
        double r36828 = r36812 - r36804;
        double r36829 = r36811 / r36828;
        double r36830 = r36822 / r36809;
        double r36831 = r36830 / r36815;
        double r36832 = r36808 ? r36829 : r36831;
        double r36833 = r36806 ? r36827 : r36832;
        return r36833;
}

Error

Bits error versus a

Bits error versus b

Bits error versus c

Derivation

  1. Split input into 2 regimes
  2. if b < 3.628799960716312e+50

    1. Initial program 17.0

      \[\begin{array}{l} \mathbf{if}\;b \ge 0.0:\\ \;\;\;\;\frac{2 \cdot c}{\left(-b\right) - \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}\\ \end{array}\]
    2. Simplified17.1

      \[\leadsto \color{blue}{\begin{array}{l} \mathbf{if}\;b \ge 0.0:\\ \;\;\;\;\frac{2 \cdot c}{\left(-b\right) - \sqrt{\mathsf{fma}\left(c \cdot 4, -a, b \cdot b\right)}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{\sqrt{\mathsf{fma}\left(c \cdot 4, -a, b \cdot b\right)} - b}{2}}{a}\\ \end{array}}\]
    3. Using strategy rm
    4. Applied add-sqr-sqrt17.2

      \[\leadsto \begin{array}{l} \mathbf{if}\;b \ge 0.0:\\ \;\;\;\;\frac{2 \cdot c}{\left(-b\right) - \sqrt{\mathsf{fma}\left(c \cdot 4, -a, b \cdot b\right)}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{\sqrt{\sqrt{\mathsf{fma}\left(c \cdot 4, -a, b \cdot b\right)} - b} \cdot \sqrt{\sqrt{\mathsf{fma}\left(c \cdot 4, -a, b \cdot b\right)} - b}}{2}}{a}\\ \end{array}\]

    if 3.628799960716312e+50 < b

    1. Initial program 26.2

      \[\begin{array}{l} \mathbf{if}\;b \ge 0.0:\\ \;\;\;\;\frac{2 \cdot c}{\left(-b\right) - \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}\\ \end{array}\]
    2. Simplified26.1

      \[\leadsto \color{blue}{\begin{array}{l} \mathbf{if}\;b \ge 0.0:\\ \;\;\;\;\frac{2 \cdot c}{\left(-b\right) - \sqrt{\mathsf{fma}\left(c \cdot 4, -a, b \cdot b\right)}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{\sqrt{\mathsf{fma}\left(c \cdot 4, -a, b \cdot b\right)} - b}{2}}{a}\\ \end{array}}\]
    3. Taylor expanded around 0 4.4

      \[\leadsto \begin{array}{l} \mathbf{if}\;b \ge 0.0:\\ \;\;\;\;\frac{2 \cdot c}{\left(-b\right) - \color{blue}{b}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{\sqrt{\mathsf{fma}\left(c \cdot 4, -a, b \cdot b\right)} - b}{2}}{a}\\ \end{array}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification13.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \le 3.628799960716311990444092539387346352569 \cdot 10^{50}:\\ \;\;\;\;\begin{array}{l} \mathbf{if}\;b \ge 0.0:\\ \;\;\;\;\frac{2 \cdot c}{\left(-b\right) - \sqrt{\mathsf{fma}\left(4 \cdot c, -a, b \cdot b\right)}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{\sqrt{\sqrt{\mathsf{fma}\left(4 \cdot c, -a, b \cdot b\right)} - b} \cdot \sqrt{\sqrt{\mathsf{fma}\left(4 \cdot c, -a, b \cdot b\right)} - b}}{2}}{a}\\ \end{array}\\ \mathbf{elif}\;b \ge 0.0:\\ \;\;\;\;\frac{2 \cdot c}{\left(-b\right) - b}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{\sqrt{\mathsf{fma}\left(4 \cdot c, -a, b \cdot b\right)} - b}{2}}{a}\\ \end{array}\]

Reproduce

herbie shell --seed 2019179 +o rules:numerics
(FPCore (a b c)
  :name "jeff quadratic root 2"
  (if (>= b 0.0) (/ (* 2.0 c) (- (- b) (sqrt (- (* b b) (* (* 4.0 a) c))))) (/ (+ (- b) (sqrt (- (* b b) (* (* 4.0 a) c)))) (* 2.0 a))))