Average Error: 28.6 → 0.6
Time: 18.3s
Precision: binary64
Cost: 28352
\[\left(\left(1.0536712127723509 \cdot 10^{-8} < a \land a < 94906265.62425156\right) \land \left(1.0536712127723509 \cdot 10^{-8} < b \land b < 94906265.62425156\right)\right) \land \left(1.0536712127723509 \cdot 10^{-8} < c \land c < 94906265.62425156\right)\]
\[\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a} \]
\[\begin{array}{l} t_0 := \mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)\\ \frac{\mathsf{fma}\left(-8, c \cdot \left(a \cdot \left(b \cdot b\right)\right), 16 \cdot \left(\left(c \cdot c\right) \cdot \left(a \cdot a\right)\right)\right)}{\left(\left(a \cdot 2\right) \cdot \left(b + \sqrt{t_0}\right)\right) \cdot \left(b \cdot b + t_0\right)} \end{array} \]
(FPCore (a b c)
 :precision binary64
 (/ (+ (- b) (sqrt (- (* b b) (* (* 4.0 a) c)))) (* 2.0 a)))
(FPCore (a b c)
 :precision binary64
 (let* ((t_0 (fma a (* c -4.0) (* b b))))
   (/
    (fma -8.0 (* c (* a (* b b))) (* 16.0 (* (* c c) (* a a))))
    (* (* (* a 2.0) (+ b (sqrt t_0))) (+ (* b b) t_0)))))
double code(double a, double b, double c) {
	return (-b + sqrt(((b * b) - ((4.0 * a) * c)))) / (2.0 * a);
}
double code(double a, double b, double c) {
	double t_0 = fma(a, (c * -4.0), (b * b));
	return fma(-8.0, (c * (a * (b * b))), (16.0 * ((c * c) * (a * a)))) / (((a * 2.0) * (b + sqrt(t_0))) * ((b * b) + t_0));
}
function code(a, b, c)
	return Float64(Float64(Float64(-b) + sqrt(Float64(Float64(b * b) - Float64(Float64(4.0 * a) * c)))) / Float64(2.0 * a))
end
function code(a, b, c)
	t_0 = fma(a, Float64(c * -4.0), Float64(b * b))
	return Float64(fma(-8.0, Float64(c * Float64(a * Float64(b * b))), Float64(16.0 * Float64(Float64(c * c) * Float64(a * a)))) / Float64(Float64(Float64(a * 2.0) * Float64(b + sqrt(t_0))) * Float64(Float64(b * b) + t_0)))
end
code[a_, b_, c_] := N[(N[((-b) + N[Sqrt[N[(N[(b * b), $MachinePrecision] - N[(N[(4.0 * a), $MachinePrecision] * c), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] / N[(2.0 * a), $MachinePrecision]), $MachinePrecision]
code[a_, b_, c_] := Block[{t$95$0 = N[(a * N[(c * -4.0), $MachinePrecision] + N[(b * b), $MachinePrecision]), $MachinePrecision]}, N[(N[(-8.0 * N[(c * N[(a * N[(b * b), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(16.0 * N[(N[(c * c), $MachinePrecision] * N[(a * a), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(N[(N[(a * 2.0), $MachinePrecision] * N[(b + N[Sqrt[t$95$0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[(N[(b * b), $MachinePrecision] + t$95$0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}
\begin{array}{l}
t_0 := \mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)\\
\frac{\mathsf{fma}\left(-8, c \cdot \left(a \cdot \left(b \cdot b\right)\right), 16 \cdot \left(\left(c \cdot c\right) \cdot \left(a \cdot a\right)\right)\right)}{\left(\left(a \cdot 2\right) \cdot \left(b + \sqrt{t_0}\right)\right) \cdot \left(b \cdot b + t_0\right)}
\end{array}

Error

Derivation

  1. Initial program 28.6

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

    \[\leadsto \color{blue}{\left(\sqrt{\mathsf{fma}\left(b, b, \left(a \cdot c\right) \cdot -4\right)} - b\right) \cdot \frac{0.5}{a}} \]
    Proof
    (*.f64 (-.f64 (sqrt.f64 (fma.f64 b b (*.f64 (*.f64 a c) -4))) b) (/.f64 1/2 a)): 0 points increase in error, 0 points decrease in error
    (*.f64 (-.f64 (sqrt.f64 (fma.f64 b b (*.f64 (*.f64 a c) (Rewrite<= metadata-eval (neg.f64 4))))) b) (/.f64 1/2 a)): 16 points increase in error, 0 points decrease in error
    (*.f64 (-.f64 (sqrt.f64 (fma.f64 b b (Rewrite<= distribute-rgt-neg-in_binary64 (neg.f64 (*.f64 (*.f64 a c) 4))))) b) (/.f64 1/2 a)): 0 points increase in error, 16 points decrease in error
    (*.f64 (-.f64 (sqrt.f64 (fma.f64 b b (neg.f64 (Rewrite<= *-commutative_binary64 (*.f64 4 (*.f64 a c)))))) b) (/.f64 1/2 a)): 16 points increase in error, 0 points decrease in error
    (*.f64 (-.f64 (sqrt.f64 (fma.f64 b b (neg.f64 (Rewrite<= associate-*l*_binary64 (*.f64 (*.f64 4 a) c))))) b) (/.f64 1/2 a)): 0 points increase in error, 16 points decrease in error
    (*.f64 (-.f64 (sqrt.f64 (Rewrite<= fma-neg_binary64 (-.f64 (*.f64 b b) (*.f64 (*.f64 4 a) c)))) b) (/.f64 1/2 a)): 16 points increase in error, 0 points decrease in error
    (*.f64 (Rewrite<= unsub-neg_binary64 (+.f64 (sqrt.f64 (-.f64 (*.f64 b b) (*.f64 (*.f64 4 a) c))) (neg.f64 b))) (/.f64 1/2 a)): 0 points increase in error, 16 points decrease in error
    (*.f64 (Rewrite<= +-commutative_binary64 (+.f64 (neg.f64 b) (sqrt.f64 (-.f64 (*.f64 b b) (*.f64 (*.f64 4 a) c))))) (/.f64 1/2 a)): 16 points increase in error, 0 points decrease in error
    (*.f64 (+.f64 (neg.f64 b) (sqrt.f64 (-.f64 (*.f64 b b) (*.f64 (*.f64 4 a) c)))) (/.f64 (Rewrite<= metadata-eval (/.f64 1 2)) a)): 0 points increase in error, 16 points decrease in error
    (*.f64 (+.f64 (neg.f64 b) (sqrt.f64 (-.f64 (*.f64 b b) (*.f64 (*.f64 4 a) c)))) (/.f64 (/.f64 (Rewrite<= metadata-eval (neg.f64 -1)) 2) a)): 16 points increase in error, 0 points decrease in error
    (Rewrite=> associate-*r/_binary64 (/.f64 (*.f64 (+.f64 (neg.f64 b) (sqrt.f64 (-.f64 (*.f64 b b) (*.f64 (*.f64 4 a) c)))) (/.f64 (neg.f64 -1) 2)) a)): 0 points increase in error, 16 points decrease in error
    (Rewrite=> associate-/l*_binary64 (/.f64 (+.f64 (neg.f64 b) (sqrt.f64 (-.f64 (*.f64 b b) (*.f64 (*.f64 4 a) c)))) (/.f64 a (/.f64 (neg.f64 -1) 2)))): 0 points increase in error, 16 points decrease in error
    (/.f64 (+.f64 (neg.f64 b) (sqrt.f64 (-.f64 (*.f64 b b) (*.f64 (*.f64 4 a) c)))) (Rewrite<= associate-/l*_binary64 (/.f64 (*.f64 a 2) (neg.f64 -1)))): 16 points increase in error, 0 points decrease in error
    (/.f64 (+.f64 (neg.f64 b) (sqrt.f64 (-.f64 (*.f64 b b) (*.f64 (*.f64 4 a) c)))) (/.f64 (Rewrite<= *-commutative_binary64 (*.f64 2 a)) (neg.f64 -1))): 0 points increase in error, 16 points decrease in error
    (/.f64 (+.f64 (neg.f64 b) (sqrt.f64 (-.f64 (*.f64 b b) (*.f64 (*.f64 4 a) c)))) (/.f64 (*.f64 2 a) (Rewrite=> metadata-eval 1))): 0 points increase in error, 16 points decrease in error
    (/.f64 (+.f64 (neg.f64 b) (sqrt.f64 (-.f64 (*.f64 b b) (*.f64 (*.f64 4 a) c)))) (Rewrite=> /-rgt-identity_binary64 (*.f64 2 a))): 16 points increase in error, 0 points decrease in error
  3. Taylor expanded in b around 0 28.6

    \[\leadsto \left(\sqrt{\color{blue}{{b}^{2} + -4 \cdot \left(c \cdot a\right)}} - b\right) \cdot \frac{0.5}{a} \]
  4. Simplified28.6

    \[\leadsto \left(\sqrt{\color{blue}{\mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)}} - b\right) \cdot \frac{0.5}{a} \]
    Proof
    (*.f64 (-.f64 (sqrt.f64 (fma.f64 a (*.f64 c -4) (*.f64 b b))) b) (/.f64 1/2 a)): 0 points increase in error, 0 points decrease in error
    (*.f64 (-.f64 (sqrt.f64 (Rewrite<= fma-def_binary64 (+.f64 (*.f64 a (*.f64 c -4)) (*.f64 b b)))) b) (/.f64 1/2 a)): 7 points increase in error, 0 points decrease in error
    (*.f64 (-.f64 (sqrt.f64 (+.f64 (Rewrite=> associate-*r*_binary64 (*.f64 (*.f64 a c) -4)) (*.f64 b b))) b) (/.f64 1/2 a)): 0 points increase in error, 7 points decrease in error
    (*.f64 (-.f64 (sqrt.f64 (+.f64 (*.f64 (Rewrite=> *-commutative_binary64 (*.f64 c a)) -4) (*.f64 b b))) b) (/.f64 1/2 a)): 7 points increase in error, 0 points decrease in error
    (*.f64 (-.f64 (sqrt.f64 (+.f64 (Rewrite<= *-commutative_binary64 (*.f64 -4 (*.f64 c a))) (*.f64 b b))) b) (/.f64 1/2 a)): 0 points increase in error, 7 points decrease in error
    (*.f64 (-.f64 (sqrt.f64 (+.f64 (*.f64 -4 (*.f64 c a)) (Rewrite<= unpow2_binary64 (pow.f64 b 2)))) b) (/.f64 1/2 a)): 7 points increase in error, 0 points decrease in error
    (*.f64 (-.f64 (sqrt.f64 (Rewrite<= +-commutative_binary64 (+.f64 (pow.f64 b 2) (*.f64 -4 (*.f64 c a))))) b) (/.f64 1/2 a)): 0 points increase in error, 7 points decrease in error
  5. Applied egg-rr27.8

    \[\leadsto \color{blue}{\frac{{\left(\mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)\right)}^{2} - {b}^{4}}{\left(\left(a \cdot 2\right) \cdot \left(b + \sqrt{\mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)}\right)\right) \cdot \left(b \cdot b + \mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)\right)}} \]
  6. Taylor expanded in a around 0 0.6

    \[\leadsto \frac{\color{blue}{-8 \cdot \left(c \cdot \left(a \cdot {b}^{2}\right)\right) + 16 \cdot \left({c}^{2} \cdot {a}^{2}\right)}}{\left(\left(a \cdot 2\right) \cdot \left(b + \sqrt{\mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)}\right)\right) \cdot \left(b \cdot b + \mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)\right)} \]
  7. Simplified0.6

    \[\leadsto \frac{\color{blue}{\mathsf{fma}\left(-8, c \cdot \left(a \cdot \left(b \cdot b\right)\right), 16 \cdot \left(\left(c \cdot c\right) \cdot \left(a \cdot a\right)\right)\right)}}{\left(\left(a \cdot 2\right) \cdot \left(b + \sqrt{\mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)}\right)\right) \cdot \left(b \cdot b + \mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)\right)} \]
    Proof
    (/.f64 (fma.f64 -8 (*.f64 c (*.f64 a (*.f64 b b))) (*.f64 16 (*.f64 (*.f64 c c) (*.f64 a a)))) (*.f64 (*.f64 (*.f64 a 2) (+.f64 b (sqrt.f64 (fma.f64 a (*.f64 c -4) (*.f64 b b))))) (+.f64 (*.f64 b b) (fma.f64 a (*.f64 c -4) (*.f64 b b))))): 0 points increase in error, 0 points decrease in error
    (/.f64 (fma.f64 -8 (*.f64 c (*.f64 a (Rewrite<= unpow2_binary64 (pow.f64 b 2)))) (*.f64 16 (*.f64 (*.f64 c c) (*.f64 a a)))) (*.f64 (*.f64 (*.f64 a 2) (+.f64 b (sqrt.f64 (fma.f64 a (*.f64 c -4) (*.f64 b b))))) (+.f64 (*.f64 b b) (fma.f64 a (*.f64 c -4) (*.f64 b b))))): 0 points increase in error, 0 points decrease in error
    (/.f64 (fma.f64 -8 (*.f64 c (*.f64 a (pow.f64 b 2))) (*.f64 16 (*.f64 (Rewrite<= unpow2_binary64 (pow.f64 c 2)) (*.f64 a a)))) (*.f64 (*.f64 (*.f64 a 2) (+.f64 b (sqrt.f64 (fma.f64 a (*.f64 c -4) (*.f64 b b))))) (+.f64 (*.f64 b b) (fma.f64 a (*.f64 c -4) (*.f64 b b))))): 0 points increase in error, 5 points decrease in error
    (/.f64 (fma.f64 -8 (*.f64 c (*.f64 a (pow.f64 b 2))) (*.f64 16 (*.f64 (pow.f64 c 2) (Rewrite<= unpow2_binary64 (pow.f64 a 2))))) (*.f64 (*.f64 (*.f64 a 2) (+.f64 b (sqrt.f64 (fma.f64 a (*.f64 c -4) (*.f64 b b))))) (+.f64 (*.f64 b b) (fma.f64 a (*.f64 c -4) (*.f64 b b))))): 0 points increase in error, 0 points decrease in error
    (/.f64 (Rewrite<= fma-def_binary64 (+.f64 (*.f64 -8 (*.f64 c (*.f64 a (pow.f64 b 2)))) (*.f64 16 (*.f64 (pow.f64 c 2) (pow.f64 a 2))))) (*.f64 (*.f64 (*.f64 a 2) (+.f64 b (sqrt.f64 (fma.f64 a (*.f64 c -4) (*.f64 b b))))) (+.f64 (*.f64 b b) (fma.f64 a (*.f64 c -4) (*.f64 b b))))): 0 points increase in error, 0 points decrease in error
  8. Final simplification0.6

    \[\leadsto \frac{\mathsf{fma}\left(-8, c \cdot \left(a \cdot \left(b \cdot b\right)\right), 16 \cdot \left(\left(c \cdot c\right) \cdot \left(a \cdot a\right)\right)\right)}{\left(\left(a \cdot 2\right) \cdot \left(b + \sqrt{\mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)}\right)\right) \cdot \left(b \cdot b + \mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)\right)} \]

Alternatives

Alternative 1
Error6.4
Cost20932
\[\begin{array}{l} t_0 := \mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)\\ \mathbf{if}\;b \leq 0.43:\\ \;\;\;\;\frac{t_0 - b \cdot b}{a} \cdot \frac{0.5}{b + \sqrt{t_0}}\\ \mathbf{else}:\\ \;\;\;\;\frac{0.5}{\mathsf{fma}\left(0.5, \frac{a}{b}, \mathsf{fma}\left(-0.5, \frac{b}{c}, \left(a \cdot a\right) \cdot \left(0.5 \cdot \frac{c}{{b}^{3}}\right)\right)\right)}\\ \end{array} \]
Alternative 2
Error6.4
Cost20932
\[\begin{array}{l} t_0 := \mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)\\ \mathbf{if}\;b \leq 0.47:\\ \;\;\;\;\frac{t_0 - b \cdot b}{b + \sqrt{t_0}} \cdot \frac{0.5}{a}\\ \mathbf{else}:\\ \;\;\;\;\frac{0.5}{\mathsf{fma}\left(0.5, \frac{a}{b}, \mathsf{fma}\left(-0.5, \frac{b}{c}, \left(a \cdot a\right) \cdot \left(0.5 \cdot \frac{c}{{b}^{3}}\right)\right)\right)}\\ \end{array} \]
Alternative 3
Error6.4
Cost20932
\[\begin{array}{l} t_0 := \mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)\\ \mathbf{if}\;b \leq 0.47:\\ \;\;\;\;\frac{0.5}{\frac{a}{\frac{t_0 - b \cdot b}{b + \sqrt{t_0}}}}\\ \mathbf{else}:\\ \;\;\;\;\frac{0.5}{\mathsf{fma}\left(0.5, \frac{a}{b}, \mathsf{fma}\left(-0.5, \frac{b}{c}, \left(a \cdot a\right) \cdot \left(0.5 \cdot \frac{c}{{b}^{3}}\right)\right)\right)}\\ \end{array} \]
Alternative 4
Error6.5
Cost20612
\[\begin{array}{l} \mathbf{if}\;b \leq 0.43:\\ \;\;\;\;\frac{0.5}{\frac{a}{\sqrt{\mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)} - b}}\\ \mathbf{else}:\\ \;\;\;\;\frac{0.5}{\mathsf{fma}\left(0.5, \frac{a}{b}, \mathsf{fma}\left(-0.5, \frac{b}{c}, \left(a \cdot a\right) \cdot \left(0.5 \cdot \frac{c}{{b}^{3}}\right)\right)\right)}\\ \end{array} \]
Alternative 5
Error6.5
Cost14340
\[\begin{array}{l} \mathbf{if}\;b \leq 0.43:\\ \;\;\;\;\frac{0.5}{\frac{a}{\sqrt{\mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)} - b}}\\ \mathbf{else}:\\ \;\;\;\;\frac{0.5}{\mathsf{fma}\left(0.5, \frac{a}{b}, \frac{-0.5}{\frac{c}{b}}\right) - \frac{a}{\frac{{b}^{3}}{a}} \cdot \left(c \cdot -0.5\right)}\\ \end{array} \]
Alternative 6
Error9.7
Cost13764
\[\begin{array}{l} \mathbf{if}\;b \leq 125:\\ \;\;\;\;\frac{0.5}{a} \cdot \left(\sqrt{\mathsf{fma}\left(a, c \cdot -4, b \cdot b\right)} - b\right)\\ \mathbf{else}:\\ \;\;\;\;\frac{0.5}{0.5 \cdot \frac{a}{b} + -0.5 \cdot \frac{b}{c}}\\ \end{array} \]
Alternative 7
Error9.7
Cost13764
\[\begin{array}{l} \mathbf{if}\;b \leq 125:\\ \;\;\;\;\frac{0.5}{a} \cdot \left(\sqrt{\mathsf{fma}\left(b, b, -4 \cdot \left(c \cdot a\right)\right)} - b\right)\\ \mathbf{else}:\\ \;\;\;\;\frac{0.5}{0.5 \cdot \frac{a}{b} + -0.5 \cdot \frac{b}{c}}\\ \end{array} \]
Alternative 8
Error9.7
Cost7492
\[\begin{array}{l} \mathbf{if}\;b \leq 125:\\ \;\;\;\;\frac{0.5}{a} \cdot \left(\sqrt{b \cdot b + a \cdot \left(c \cdot -4\right)} - b\right)\\ \mathbf{else}:\\ \;\;\;\;\frac{0.5}{0.5 \cdot \frac{a}{b} + -0.5 \cdot \frac{b}{c}}\\ \end{array} \]
Alternative 9
Error9.7
Cost7492
\[\begin{array}{l} \mathbf{if}\;b \leq 125:\\ \;\;\;\;\frac{0.5}{\frac{a}{\sqrt{b \cdot b + -4 \cdot \left(c \cdot a\right)} - b}}\\ \mathbf{else}:\\ \;\;\;\;\frac{0.5}{0.5 \cdot \frac{a}{b} + -0.5 \cdot \frac{b}{c}}\\ \end{array} \]
Alternative 10
Error11.5
Cost832
\[\frac{0.5}{0.5 \cdot \frac{a}{b} + -0.5 \cdot \frac{b}{c}} \]
Alternative 11
Error22.7
Cost256
\[\frac{-c}{b} \]

Error

Reproduce

herbie shell --seed 2022343 
(FPCore (a b c)
  :name "Quadratic roots, narrow range"
  :precision binary64
  :pre (and (and (and (< 1.0536712127723509e-8 a) (< a 94906265.62425156)) (and (< 1.0536712127723509e-8 b) (< b 94906265.62425156))) (and (< 1.0536712127723509e-8 c) (< c 94906265.62425156)))
  (/ (+ (- b) (sqrt (- (* b b) (* (* 4.0 a) c)))) (* 2.0 a)))