Average Error: 33.3 → 13.8
Time: 31.3s
Precision: 64
\[\frac{\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}{3 \cdot a}\]
\[\begin{array}{l} \mathbf{if}\;b \le -5.86823424460126 \cdot 10^{+153}:\\ \;\;\;\;\frac{(\frac{3}{2} \cdot \left(\frac{a}{\frac{b}{c}}\right) + \left(b \cdot -2\right))_*}{3 \cdot a}\\ \mathbf{elif}\;b \le 1.5222805660690795 \cdot 10^{-59}:\\ \;\;\;\;\frac{\left|\sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}\right| + \left(-b\right)}{3 \cdot a}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{-3}{2} \cdot \frac{a \cdot c}{b}}{3 \cdot a}\\ \end{array}\]
\frac{\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}{3 \cdot a}
\begin{array}{l}
\mathbf{if}\;b \le -5.86823424460126 \cdot 10^{+153}:\\
\;\;\;\;\frac{(\frac{3}{2} \cdot \left(\frac{a}{\frac{b}{c}}\right) + \left(b \cdot -2\right))_*}{3 \cdot a}\\

\mathbf{elif}\;b \le 1.5222805660690795 \cdot 10^{-59}:\\
\;\;\;\;\frac{\left|\sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}\right| + \left(-b\right)}{3 \cdot a}\\

\mathbf{else}:\\
\;\;\;\;\frac{\frac{-3}{2} \cdot \frac{a \cdot c}{b}}{3 \cdot a}\\

\end{array}
double f(double a, double b, double c, double __attribute__((unused)) d) {
        double r20049082 = b;
        double r20049083 = -r20049082;
        double r20049084 = r20049082 * r20049082;
        double r20049085 = 3.0;
        double r20049086 = a;
        double r20049087 = r20049085 * r20049086;
        double r20049088 = c;
        double r20049089 = r20049087 * r20049088;
        double r20049090 = r20049084 - r20049089;
        double r20049091 = sqrt(r20049090);
        double r20049092 = r20049083 + r20049091;
        double r20049093 = r20049092 / r20049087;
        return r20049093;
}

double f(double a, double b, double c, double __attribute__((unused)) d) {
        double r20049094 = b;
        double r20049095 = -5.86823424460126e+153;
        bool r20049096 = r20049094 <= r20049095;
        double r20049097 = 1.5;
        double r20049098 = a;
        double r20049099 = c;
        double r20049100 = r20049094 / r20049099;
        double r20049101 = r20049098 / r20049100;
        double r20049102 = -2.0;
        double r20049103 = r20049094 * r20049102;
        double r20049104 = fma(r20049097, r20049101, r20049103);
        double r20049105 = 3.0;
        double r20049106 = r20049105 * r20049098;
        double r20049107 = r20049104 / r20049106;
        double r20049108 = 1.5222805660690795e-59;
        bool r20049109 = r20049094 <= r20049108;
        double r20049110 = r20049094 * r20049094;
        double r20049111 = r20049106 * r20049099;
        double r20049112 = r20049110 - r20049111;
        double r20049113 = sqrt(r20049112);
        double r20049114 = fabs(r20049113);
        double r20049115 = -r20049094;
        double r20049116 = r20049114 + r20049115;
        double r20049117 = r20049116 / r20049106;
        double r20049118 = -1.5;
        double r20049119 = r20049098 * r20049099;
        double r20049120 = r20049119 / r20049094;
        double r20049121 = r20049118 * r20049120;
        double r20049122 = r20049121 / r20049106;
        double r20049123 = r20049109 ? r20049117 : r20049122;
        double r20049124 = r20049096 ? r20049107 : r20049123;
        return r20049124;
}

Error

Bits error versus a

Bits error versus b

Bits error versus c

Bits error versus d

Derivation

  1. Split input into 3 regimes
  2. if b < -5.86823424460126e+153

    1. Initial program 60.8

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

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

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

    if -5.86823424460126e+153 < b < 1.5222805660690795e-59

    1. Initial program 12.5

      \[\frac{\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}{3 \cdot a}\]
    2. Using strategy rm
    3. Applied add-cube-cbrt12.8

      \[\leadsto \frac{\left(-b\right) + \sqrt{b \cdot b - \color{blue}{\left(\sqrt[3]{\left(3 \cdot a\right) \cdot c} \cdot \sqrt[3]{\left(3 \cdot a\right) \cdot c}\right) \cdot \sqrt[3]{\left(3 \cdot a\right) \cdot c}}}}{3 \cdot a}\]
    4. Using strategy rm
    5. Applied add-sqr-sqrt12.8

      \[\leadsto \frac{\left(-b\right) + \sqrt{\color{blue}{\sqrt{b \cdot b - \left(\sqrt[3]{\left(3 \cdot a\right) \cdot c} \cdot \sqrt[3]{\left(3 \cdot a\right) \cdot c}\right) \cdot \sqrt[3]{\left(3 \cdot a\right) \cdot c}} \cdot \sqrt{b \cdot b - \left(\sqrt[3]{\left(3 \cdot a\right) \cdot c} \cdot \sqrt[3]{\left(3 \cdot a\right) \cdot c}\right) \cdot \sqrt[3]{\left(3 \cdot a\right) \cdot c}}}}}{3 \cdot a}\]
    6. Applied rem-sqrt-square12.8

      \[\leadsto \frac{\left(-b\right) + \color{blue}{\left|\sqrt{b \cdot b - \left(\sqrt[3]{\left(3 \cdot a\right) \cdot c} \cdot \sqrt[3]{\left(3 \cdot a\right) \cdot c}\right) \cdot \sqrt[3]{\left(3 \cdot a\right) \cdot c}}\right|}}{3 \cdot a}\]
    7. Simplified12.5

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

    if 1.5222805660690795e-59 < b

    1. Initial program 53.0

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

      \[\leadsto \frac{\color{blue}{\frac{-3}{2} \cdot \frac{a \cdot c}{b}}}{3 \cdot a}\]
  3. Recombined 3 regimes into one program.
  4. Final simplification13.8

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \le -5.86823424460126 \cdot 10^{+153}:\\ \;\;\;\;\frac{(\frac{3}{2} \cdot \left(\frac{a}{\frac{b}{c}}\right) + \left(b \cdot -2\right))_*}{3 \cdot a}\\ \mathbf{elif}\;b \le 1.5222805660690795 \cdot 10^{-59}:\\ \;\;\;\;\frac{\left|\sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}\right| + \left(-b\right)}{3 \cdot a}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{-3}{2} \cdot \frac{a \cdot c}{b}}{3 \cdot a}\\ \end{array}\]

Reproduce

herbie shell --seed 2019119 +o rules:numerics
(FPCore (a b c d)
  :name "Cubic critical"
  (/ (+ (- b) (sqrt (- (* b b) (* (* 3 a) c)))) (* 3 a)))