(FPCore (m12 m32 s15 s35) :precision binary64 (+ (+ (- (* (* (- 2.0) (sqrt m12)) (sqrt m32)) m32) s15) s35))
double code(double m12, double m32, double s15, double s35) { return ((((-2.0 * sqrt(m12)) * sqrt(m32)) - m32) + s15) + s35; }
real(8) function code(m12, m32, s15, s35) real(8), intent (in) :: m12 real(8), intent (in) :: m32 real(8), intent (in) :: s15 real(8), intent (in) :: s35 code = ((((-2.0d0 * sqrt(m12)) * sqrt(m32)) - m32) + s15) + s35 end function
public static double code(double m12, double m32, double s15, double s35) { return ((((-2.0 * Math.sqrt(m12)) * Math.sqrt(m32)) - m32) + s15) + s35; }
def code(m12, m32, s15, s35): return ((((-2.0 * math.sqrt(m12)) * math.sqrt(m32)) - m32) + s15) + s35
function code(m12, m32, s15, s35) return Float64(Float64(Float64(Float64(Float64(Float64(-2.0) * sqrt(m12)) * sqrt(m32)) - m32) + s15) + s35) end
function tmp = code(m12, m32, s15, s35) tmp = ((((-2.0 * sqrt(m12)) * sqrt(m32)) - m32) + s15) + s35; end
code[m12_, m32_, s15_, s35_] := N[(N[(N[(N[(N[((-2.0) * N[Sqrt[m12], $MachinePrecision]), $MachinePrecision] * N[Sqrt[m32], $MachinePrecision]), $MachinePrecision] - m32), $MachinePrecision] + s15), $MachinePrecision] + s35), $MachinePrecision]
\begin{array}{l} \\ \left(\left(\left(\left(-2\right) \cdot \sqrt{m12}\right) \cdot \sqrt{m32} - m32\right) + s15\right) + s35 \end{array}
Sampling outcomes in binary64 precision:
Herbie found 4 alternatives:
Alternative | Accuracy | Speedup |
---|
(FPCore (m12 m32 s15 s35) :precision binary64 (+ (+ (- (* (* (- 2.0) (sqrt m12)) (sqrt m32)) m32) s15) s35))
double code(double m12, double m32, double s15, double s35) { return ((((-2.0 * sqrt(m12)) * sqrt(m32)) - m32) + s15) + s35; }
real(8) function code(m12, m32, s15, s35) real(8), intent (in) :: m12 real(8), intent (in) :: m32 real(8), intent (in) :: s15 real(8), intent (in) :: s35 code = ((((-2.0d0 * sqrt(m12)) * sqrt(m32)) - m32) + s15) + s35 end function
public static double code(double m12, double m32, double s15, double s35) { return ((((-2.0 * Math.sqrt(m12)) * Math.sqrt(m32)) - m32) + s15) + s35; }
def code(m12, m32, s15, s35): return ((((-2.0 * math.sqrt(m12)) * math.sqrt(m32)) - m32) + s15) + s35
function code(m12, m32, s15, s35) return Float64(Float64(Float64(Float64(Float64(Float64(-2.0) * sqrt(m12)) * sqrt(m32)) - m32) + s15) + s35) end
function tmp = code(m12, m32, s15, s35) tmp = ((((-2.0 * sqrt(m12)) * sqrt(m32)) - m32) + s15) + s35; end
code[m12_, m32_, s15_, s35_] := N[(N[(N[(N[(N[((-2.0) * N[Sqrt[m12], $MachinePrecision]), $MachinePrecision] * N[Sqrt[m32], $MachinePrecision]), $MachinePrecision] - m32), $MachinePrecision] + s15), $MachinePrecision] + s35), $MachinePrecision]
\begin{array}{l} \\ \left(\left(\left(\left(-2\right) \cdot \sqrt{m12}\right) \cdot \sqrt{m32} - m32\right) + s15\right) + s35 \end{array}
(FPCore (m12 m32 s15 s35) :precision binary64 (- (fma (sqrt (* m32 m12)) -2.0 s35) (- m32 s15)))
double code(double m12, double m32, double s15, double s35) { return fma(sqrt((m32 * m12)), -2.0, s35) - (m32 - s15); }
function code(m12, m32, s15, s35) return Float64(fma(sqrt(Float64(m32 * m12)), -2.0, s35) - Float64(m32 - s15)) end
code[m12_, m32_, s15_, s35_] := N[(N[(N[Sqrt[N[(m32 * m12), $MachinePrecision]], $MachinePrecision] * -2.0 + s35), $MachinePrecision] - N[(m32 - s15), $MachinePrecision]), $MachinePrecision]
\begin{array}{l} \\ \mathsf{fma}\left(\sqrt{m32 \cdot m12}, -2, s35\right) - \left(m32 - s15\right) \end{array}
Initial program 100.0%
lift-+.f64
N/A
+-commutative
N/A
lift-+.f64
N/A
lift--.f64
N/A
associate-+l-
N/A
associate-+r-
N/A
lower--.f64
N/A
Applied rewrites100.0%
(FPCore (m12 m32 s15 s35) :precision binary64 (+ (fma (sqrt (* m32 m12)) -2.0 s15) s35))
double code(double m12, double m32, double s15, double s35) { return fma(sqrt((m32 * m12)), -2.0, s15) + s35; }
function code(m12, m32, s15, s35) return Float64(fma(sqrt(Float64(m32 * m12)), -2.0, s15) + s35) end
code[m12_, m32_, s15_, s35_] := N[(N[(N[Sqrt[N[(m32 * m12), $MachinePrecision]], $MachinePrecision] * -2.0 + s15), $MachinePrecision] + s35), $MachinePrecision]
\begin{array}{l} \\ \mathsf{fma}\left(\sqrt{m32 \cdot m12}, -2, s15\right) + s35 \end{array}
Initial program 100.0%
Taylor expanded in m32 around 0
+-commutative
N/A
*-commutative
N/A
lower-fma.f64
N/A
lower-sqrt.f64
N/A
*-commutative
N/A
lower-*.f64
32.3
Applied rewrites32.3%
(FPCore (m12 m32 s15 s35) :precision binary64 (+ (* (sqrt (* m32 m12)) -2.0) s35))
double code(double m12, double m32, double s15, double s35) { return (sqrt((m32 * m12)) * -2.0) + s35; }
real(8) function code(m12, m32, s15, s35) real(8), intent (in) :: m12 real(8), intent (in) :: m32 real(8), intent (in) :: s15 real(8), intent (in) :: s35 code = (sqrt((m32 * m12)) * (-2.0d0)) + s35 end function
public static double code(double m12, double m32, double s15, double s35) { return (Math.sqrt((m32 * m12)) * -2.0) + s35; }
def code(m12, m32, s15, s35): return (math.sqrt((m32 * m12)) * -2.0) + s35
function code(m12, m32, s15, s35) return Float64(Float64(sqrt(Float64(m32 * m12)) * -2.0) + s35) end
function tmp = code(m12, m32, s15, s35) tmp = (sqrt((m32 * m12)) * -2.0) + s35; end
code[m12_, m32_, s15_, s35_] := N[(N[(N[Sqrt[N[(m32 * m12), $MachinePrecision]], $MachinePrecision] * -2.0), $MachinePrecision] + s35), $MachinePrecision]
\begin{array}{l} \\ \sqrt{m32 \cdot m12} \cdot -2 + s35 \end{array}
Initial program 100.0%
Taylor expanded in m12 around -inf
associate-*r*
N/A
unpow2
N/A
rem-square-sqrt
N/A
*-commutative
N/A
associate-*l*
N/A
metadata-eval
N/A
lower-*.f64
N/A
lower-sqrt.f64
N/A
*-commutative
N/A
lower-*.f64
1.6
Applied rewrites1.6%
(FPCore (m12 m32 s15 s35) :precision binary64 (* (sqrt (* m32 m12)) -2.0))
double code(double m12, double m32, double s15, double s35) { return sqrt((m32 * m12)) * -2.0; }
real(8) function code(m12, m32, s15, s35) real(8), intent (in) :: m12 real(8), intent (in) :: m32 real(8), intent (in) :: s15 real(8), intent (in) :: s35 code = sqrt((m32 * m12)) * (-2.0d0) end function
public static double code(double m12, double m32, double s15, double s35) { return Math.sqrt((m32 * m12)) * -2.0; }
def code(m12, m32, s15, s35): return math.sqrt((m32 * m12)) * -2.0
function code(m12, m32, s15, s35) return Float64(sqrt(Float64(m32 * m12)) * -2.0) end
function tmp = code(m12, m32, s15, s35) tmp = sqrt((m32 * m12)) * -2.0; end
code[m12_, m32_, s15_, s35_] := N[(N[Sqrt[N[(m32 * m12), $MachinePrecision]], $MachinePrecision] * -2.0), $MachinePrecision]
\begin{array}{l} \\ \sqrt{m32 \cdot m12} \cdot -2 \end{array}
Initial program 100.0%
Taylor expanded in m12 around -inf
associate-*r*
N/A
unpow2
N/A
rem-square-sqrt
N/A
*-commutative
N/A
associate-*l*
N/A
metadata-eval
N/A
lower-*.f64
N/A
lower-sqrt.f64
N/A
*-commutative
N/A
lower-*.f64
1.6
Applied rewrites1.6%
Taylor expanded in m12 around -inf
*-commutative
N/A
unpow2
N/A
rem-square-sqrt
N/A
associate-*r*
N/A
metadata-eval
N/A
*-commutative
N/A
lower-*.f64
N/A
lower-sqrt.f64
N/A
*-commutative
N/A
lower-*.f64
1.6
Applied rewrites1.6%
herbie shell --seed 1
(FPCore (m12 m32 s15 s35)
:name "-2*sqrt(m12)*sqrt(m32) - m32 + s15+ s35"
:precision binary64
:pre (and (and (and (and (<= 2.6111896789072276e-7 m12) (<= m12 2.6111896789072276e-7)) (and (<= 0.01947989372100387 m32) (<= m32 0.01947989372100387))) (and (<= 12.9767 s15) (<= s15 12.9767))) (and (<= -0.14672413413675064 s35) (<= s35 -0.14672413413675064)))
(+ (+ (- (* (* (- 2.0) (sqrt m12)) (sqrt m32)) m32) s15) s35))