
(FPCore (a b c) :precision binary64 (/ (+ (- b) (sqrt (- (* b b) (* (* 4.0 a) c)))) (* 2.0 a)))
double code(double a, double b, double c) {
return (-b + sqrt(((b * b) - ((4.0 * a) * c)))) / (2.0 * a);
}
real(8) function code(a, b, c)
real(8), intent (in) :: a
real(8), intent (in) :: b
real(8), intent (in) :: c
code = (-b + sqrt(((b * b) - ((4.0d0 * a) * c)))) / (2.0d0 * a)
end function
public static double code(double a, double b, double c) {
return (-b + Math.sqrt(((b * b) - ((4.0 * a) * c)))) / (2.0 * a);
}
def code(a, b, c): return (-b + math.sqrt(((b * b) - ((4.0 * a) * c)))) / (2.0 * a)
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 tmp = code(a, b, c) tmp = (-b + sqrt(((b * b) - ((4.0 * a) * c)))) / (2.0 * a); 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]
\begin{array}{l}
\\
\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 7 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (a b c) :precision binary64 (/ (+ (- b) (sqrt (- (* b b) (* (* 4.0 a) c)))) (* 2.0 a)))
double code(double a, double b, double c) {
return (-b + sqrt(((b * b) - ((4.0 * a) * c)))) / (2.0 * a);
}
real(8) function code(a, b, c)
real(8), intent (in) :: a
real(8), intent (in) :: b
real(8), intent (in) :: c
code = (-b + sqrt(((b * b) - ((4.0d0 * a) * c)))) / (2.0d0 * a)
end function
public static double code(double a, double b, double c) {
return (-b + Math.sqrt(((b * b) - ((4.0 * a) * c)))) / (2.0 * a);
}
def code(a, b, c): return (-b + math.sqrt(((b * b) - ((4.0 * a) * c)))) / (2.0 * a)
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 tmp = code(a, b, c) tmp = (-b + sqrt(((b * b) - ((4.0 * a) * c)))) / (2.0 * a); 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]
\begin{array}{l}
\\
\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}
\end{array}
(FPCore (a b c)
:precision binary64
(let* ((t_0 (* b (* b b))))
(fma
(fma
(/ (* (* (* c c) (* c c)) (* a 20.0)) (* b (* t_0 t_0)))
-0.25
(* (* c (* c c)) (* -2.0 (pow b -5.0))))
(* a a)
(/ (fma c (* c (/ a (* b b))) c) (- b)))))
double code(double a, double b, double c) {
double t_0 = b * (b * b);
return fma(fma(((((c * c) * (c * c)) * (a * 20.0)) / (b * (t_0 * t_0))), -0.25, ((c * (c * c)) * (-2.0 * pow(b, -5.0)))), (a * a), (fma(c, (c * (a / (b * b))), c) / -b));
}
function code(a, b, c) t_0 = Float64(b * Float64(b * b)) return fma(fma(Float64(Float64(Float64(Float64(c * c) * Float64(c * c)) * Float64(a * 20.0)) / Float64(b * Float64(t_0 * t_0))), -0.25, Float64(Float64(c * Float64(c * c)) * Float64(-2.0 * (b ^ -5.0)))), Float64(a * a), Float64(fma(c, Float64(c * Float64(a / Float64(b * b))), c) / Float64(-b))) end
code[a_, b_, c_] := Block[{t$95$0 = N[(b * N[(b * b), $MachinePrecision]), $MachinePrecision]}, N[(N[(N[(N[(N[(N[(c * c), $MachinePrecision] * N[(c * c), $MachinePrecision]), $MachinePrecision] * N[(a * 20.0), $MachinePrecision]), $MachinePrecision] / N[(b * N[(t$95$0 * t$95$0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * -0.25 + N[(N[(c * N[(c * c), $MachinePrecision]), $MachinePrecision] * N[(-2.0 * N[Power[b, -5.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[(a * a), $MachinePrecision] + N[(N[(c * N[(c * N[(a / N[(b * b), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + c), $MachinePrecision] / (-b)), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := b \cdot \left(b \cdot b\right)\\
\mathsf{fma}\left(\mathsf{fma}\left(\frac{\left(\left(c \cdot c\right) \cdot \left(c \cdot c\right)\right) \cdot \left(a \cdot 20\right)}{b \cdot \left(t\_0 \cdot t\_0\right)}, -0.25, \left(c \cdot \left(c \cdot c\right)\right) \cdot \left(-2 \cdot {b}^{-5}\right)\right), a \cdot a, \frac{\mathsf{fma}\left(c, c \cdot \frac{a}{b \cdot b}, c\right)}{-b}\right)
\end{array}
\end{array}
Initial program 15.7%
Taylor expanded in a around 0
Applied rewrites98.4%
Applied rewrites98.4%
Final simplification98.4%
(FPCore (a b c)
:precision binary64
(let* ((t_0 (* b (* b b))))
(fma
(fma (* c c) (/ a (* b b)) c)
(/ -1.0 b)
(*
(* a a)
(fma
(/ (* -5.0 (* a (* c c))) (* b (* t_0 t_0)))
(* c c)
(* (* (* c c) -2.0) (* c (pow b -5.0))))))))
double code(double a, double b, double c) {
double t_0 = b * (b * b);
return fma(fma((c * c), (a / (b * b)), c), (-1.0 / b), ((a * a) * fma(((-5.0 * (a * (c * c))) / (b * (t_0 * t_0))), (c * c), (((c * c) * -2.0) * (c * pow(b, -5.0))))));
}
function code(a, b, c) t_0 = Float64(b * Float64(b * b)) return fma(fma(Float64(c * c), Float64(a / Float64(b * b)), c), Float64(-1.0 / b), Float64(Float64(a * a) * fma(Float64(Float64(-5.0 * Float64(a * Float64(c * c))) / Float64(b * Float64(t_0 * t_0))), Float64(c * c), Float64(Float64(Float64(c * c) * -2.0) * Float64(c * (b ^ -5.0)))))) end
code[a_, b_, c_] := Block[{t$95$0 = N[(b * N[(b * b), $MachinePrecision]), $MachinePrecision]}, N[(N[(N[(c * c), $MachinePrecision] * N[(a / N[(b * b), $MachinePrecision]), $MachinePrecision] + c), $MachinePrecision] * N[(-1.0 / b), $MachinePrecision] + N[(N[(a * a), $MachinePrecision] * N[(N[(N[(-5.0 * N[(a * N[(c * c), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(b * N[(t$95$0 * t$95$0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[(c * c), $MachinePrecision] + N[(N[(N[(c * c), $MachinePrecision] * -2.0), $MachinePrecision] * N[(c * N[Power[b, -5.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := b \cdot \left(b \cdot b\right)\\
\mathsf{fma}\left(\mathsf{fma}\left(c \cdot c, \frac{a}{b \cdot b}, c\right), \frac{-1}{b}, \left(a \cdot a\right) \cdot \mathsf{fma}\left(\frac{-5 \cdot \left(a \cdot \left(c \cdot c\right)\right)}{b \cdot \left(t\_0 \cdot t\_0\right)}, c \cdot c, \left(\left(c \cdot c\right) \cdot -2\right) \cdot \left(c \cdot {b}^{-5}\right)\right)\right)
\end{array}
\end{array}
Initial program 17.8%
Taylor expanded in a around 0
Applied rewrites97.5%
Applied rewrites97.5%
Applied rewrites97.2%
Applied rewrites97.2%
Final simplification97.2%
herbie shell --seed 2024222
(FPCore (a b c)
:name "Quadratic roots, wide range"
:precision binary64
:pre (and (and (and (< 4.930380657631324e-32 a) (< a 2.028240960365167e+31)) (and (< 4.930380657631324e-32 b) (< b 2.028240960365167e+31))) (and (< 4.930380657631324e-32 c) (< c 2.028240960365167e+31)))
(/ (+ (- b) (sqrt (- (* b b) (* (* 4.0 a) c)))) (* 2.0 a)))