Average Error: 44.1 → 11.0
Time: 14.0s
Precision: 64
\[1.1102230246251565404236316680908203125 \cdot 10^{-16} \lt a \lt 9007199254740992 \land 1.1102230246251565404236316680908203125 \cdot 10^{-16} \lt b \lt 9007199254740992 \land 1.1102230246251565404236316680908203125 \cdot 10^{-16} \lt c \lt 9007199254740992\]
\[\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 0.001901386380797128339975587962840108957607:\\ \;\;\;\;\frac{\frac{\sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c} - b}{3}}{a}\\ \mathbf{else}:\\ \;\;\;\;-0.5 \cdot \frac{c}{b}\\ \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 0.001901386380797128339975587962840108957607:\\
\;\;\;\;\frac{\frac{\sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c} - b}{3}}{a}\\

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

\end{array}
double f(double a, double b, double c) {
        double r64223 = b;
        double r64224 = -r64223;
        double r64225 = r64223 * r64223;
        double r64226 = 3.0;
        double r64227 = a;
        double r64228 = r64226 * r64227;
        double r64229 = c;
        double r64230 = r64228 * r64229;
        double r64231 = r64225 - r64230;
        double r64232 = sqrt(r64231);
        double r64233 = r64224 + r64232;
        double r64234 = r64233 / r64228;
        return r64234;
}

double f(double a, double b, double c) {
        double r64235 = b;
        double r64236 = 0.0019013863807971283;
        bool r64237 = r64235 <= r64236;
        double r64238 = r64235 * r64235;
        double r64239 = 3.0;
        double r64240 = a;
        double r64241 = r64239 * r64240;
        double r64242 = c;
        double r64243 = r64241 * r64242;
        double r64244 = r64238 - r64243;
        double r64245 = sqrt(r64244);
        double r64246 = r64245 - r64235;
        double r64247 = r64246 / r64239;
        double r64248 = r64247 / r64240;
        double r64249 = -0.5;
        double r64250 = r64242 / r64235;
        double r64251 = r64249 * r64250;
        double r64252 = r64237 ? r64248 : r64251;
        return r64252;
}

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 2 regimes
  2. if b < 0.0019013863807971283

    1. Initial program 20.4

      \[\frac{\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}{3 \cdot a}\]
    2. Using strategy rm
    3. Applied associate-/r*20.4

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

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

    if 0.0019013863807971283 < b

    1. Initial program 46.4

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

      \[\leadsto \color{blue}{-0.5 \cdot \frac{c}{b}}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification11.0

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \le 0.001901386380797128339975587962840108957607:\\ \;\;\;\;\frac{\frac{\sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c} - b}{3}}{a}\\ \mathbf{else}:\\ \;\;\;\;-0.5 \cdot \frac{c}{b}\\ \end{array}\]

Reproduce

herbie shell --seed 2019208 +o rules:numerics
(FPCore (a b c)
  :name "Cubic critical, medium range"
  :precision binary64
  :pre (and (< 1.11022e-16 a 9.0072e15) (< 1.11022e-16 b 9.0072e15) (< 1.11022e-16 c 9.0072e15))
  (/ (+ (- b) (sqrt (- (* b b) (* (* 3 a) c)))) (* 3 a)))