(FPCore (w wp q) :precision binary64 (- (* (- (cos w)) (pow wp 2.0)) (* (/ (sin w) w) q)))
double code(double w, double wp, double q) { return (-cos(w) * pow(wp, 2.0)) - ((sin(w) / w) * q); }
real(8) function code(w, wp, q) real(8), intent (in) :: w real(8), intent (in) :: wp real(8), intent (in) :: q code = (-cos(w) * (wp ** 2.0d0)) - ((sin(w) / w) * q) end function
public static double code(double w, double wp, double q) { return (-Math.cos(w) * Math.pow(wp, 2.0)) - ((Math.sin(w) / w) * q); }
def code(w, wp, q): return (-math.cos(w) * math.pow(wp, 2.0)) - ((math.sin(w) / w) * q)
function code(w, wp, q) return Float64(Float64(Float64(-cos(w)) * (wp ^ 2.0)) - Float64(Float64(sin(w) / w) * q)) end
function tmp = code(w, wp, q) tmp = (-cos(w) * (wp ^ 2.0)) - ((sin(w) / w) * q); end
code[w_, wp_, q_] := N[(N[((-N[Cos[w], $MachinePrecision]) * N[Power[wp, 2.0], $MachinePrecision]), $MachinePrecision] - N[(N[(N[Sin[w], $MachinePrecision] / w), $MachinePrecision] * q), $MachinePrecision]), $MachinePrecision]
\begin{array}{l} \\ \left(-\cos w\right) \cdot {wp}^{2} - \frac{\sin w}{w} \cdot q \end{array}
Sampling outcomes in binary64 precision:
Herbie found 7 alternatives:
Alternative | Accuracy | Speedup |
---|
(FPCore (w wp q) :precision binary64 (- (* (- (cos w)) (pow wp 2.0)) (* (/ (sin w) w) q)))
double code(double w, double wp, double q) { return (-cos(w) * pow(wp, 2.0)) - ((sin(w) / w) * q); }
real(8) function code(w, wp, q) real(8), intent (in) :: w real(8), intent (in) :: wp real(8), intent (in) :: q code = (-cos(w) * (wp ** 2.0d0)) - ((sin(w) / w) * q) end function
public static double code(double w, double wp, double q) { return (-Math.cos(w) * Math.pow(wp, 2.0)) - ((Math.sin(w) / w) * q); }
def code(w, wp, q): return (-math.cos(w) * math.pow(wp, 2.0)) - ((math.sin(w) / w) * q)
function code(w, wp, q) return Float64(Float64(Float64(-cos(w)) * (wp ^ 2.0)) - Float64(Float64(sin(w) / w) * q)) end
function tmp = code(w, wp, q) tmp = (-cos(w) * (wp ^ 2.0)) - ((sin(w) / w) * q); end
code[w_, wp_, q_] := N[(N[((-N[Cos[w], $MachinePrecision]) * N[Power[wp, 2.0], $MachinePrecision]), $MachinePrecision] - N[(N[(N[Sin[w], $MachinePrecision] / w), $MachinePrecision] * q), $MachinePrecision]), $MachinePrecision]
\begin{array}{l} \\ \left(-\cos w\right) \cdot {wp}^{2} - \frac{\sin w}{w} \cdot q \end{array}
(FPCore (w wp q) :precision binary64 (- (* (- (cos w)) (pow wp 2.0)) (* (/ (sin w) w) q)))
double code(double w, double wp, double q) { return (-cos(w) * pow(wp, 2.0)) - ((sin(w) / w) * q); }
real(8) function code(w, wp, q) real(8), intent (in) :: w real(8), intent (in) :: wp real(8), intent (in) :: q code = (-cos(w) * (wp ** 2.0d0)) - ((sin(w) / w) * q) end function
public static double code(double w, double wp, double q) { return (-Math.cos(w) * Math.pow(wp, 2.0)) - ((Math.sin(w) / w) * q); }
def code(w, wp, q): return (-math.cos(w) * math.pow(wp, 2.0)) - ((math.sin(w) / w) * q)
function code(w, wp, q) return Float64(Float64(Float64(-cos(w)) * (wp ^ 2.0)) - Float64(Float64(sin(w) / w) * q)) end
function tmp = code(w, wp, q) tmp = (-cos(w) * (wp ^ 2.0)) - ((sin(w) / w) * q); end
code[w_, wp_, q_] := N[(N[((-N[Cos[w], $MachinePrecision]) * N[Power[wp, 2.0], $MachinePrecision]), $MachinePrecision] - N[(N[(N[Sin[w], $MachinePrecision] / w), $MachinePrecision] * q), $MachinePrecision]), $MachinePrecision]
\begin{array}{l} \\ \left(-\cos w\right) \cdot {wp}^{2} - \frac{\sin w}{w} \cdot q \end{array}
Initial program 100.0%
(FPCore (w wp q) :precision binary64 (if (<= (pow wp 2.0) 2e-102) (- q) (- (* wp wp))))
double code(double w, double wp, double q) { double tmp; if (pow(wp, 2.0) <= 2e-102) { tmp = -q; } else { tmp = -(wp * wp); } return tmp; }
real(8) function code(w, wp, q) real(8), intent (in) :: w real(8), intent (in) :: wp real(8), intent (in) :: q real(8) :: tmp if ((wp ** 2.0d0) <= 2d-102) then tmp = -q else tmp = -(wp * wp) end if code = tmp end function
public static double code(double w, double wp, double q) { double tmp; if (Math.pow(wp, 2.0) <= 2e-102) { tmp = -q; } else { tmp = -(wp * wp); } return tmp; }
def code(w, wp, q): tmp = 0 if math.pow(wp, 2.0) <= 2e-102: tmp = -q else: tmp = -(wp * wp) return tmp
function code(w, wp, q) tmp = 0.0 if ((wp ^ 2.0) <= 2e-102) tmp = Float64(-q); else tmp = Float64(-Float64(wp * wp)); end return tmp end
function tmp_2 = code(w, wp, q) tmp = 0.0; if ((wp ^ 2.0) <= 2e-102) tmp = -q; else tmp = -(wp * wp); end tmp_2 = tmp; end
code[w_, wp_, q_] := If[LessEqual[N[Power[wp, 2.0], $MachinePrecision], 2e-102], (-q), (-N[(wp * wp), $MachinePrecision])]
\begin{array}{l} \\ \begin{array}{l} \mathbf{if}\;{wp}^{2} \leq 2 \cdot 10^{-102}:\\ \;\;\;\;-q\\ \mathbf{else}:\\ \;\;\;\;-wp \cdot wp\\ \end{array} \end{array}
if (pow.f64 wp #s(literal 2 binary64)) < 1.99999999999999987e-102
Initial program 100.0%
Taylor expanded in w around 0
sub-neg
N/A
mul-1-neg
N/A
distribute-neg-out
N/A
lower-neg.f64
N/A
unpow2
N/A
lower-fma.f64
99.4
Applied rewrites99.4%
Taylor expanded in wp around 0
Applied rewrites86.9%
if 1.99999999999999987e-102 < (pow.f64 wp #s(literal 2 binary64))
Initial program 99.9%
Taylor expanded in w around 0
sub-neg
N/A
mul-1-neg
N/A
distribute-neg-out
N/A
lower-neg.f64
N/A
unpow2
N/A
lower-fma.f64
97.4
Applied rewrites97.4%
Taylor expanded in wp around inf
Applied rewrites83.0%
(FPCore (w wp q) :precision binary64 (fma (* (fma 0.16666666666666666 q (fma (* 0.5 wp) wp (* (fma (fma 0.001388888888888889 (* w w) -0.041666666666666664) (* wp wp) (* q (fma (* w w) 0.0001984126984126984 -0.008333333333333333))) (* w w)))) w) w (- (fma wp wp q))))
double code(double w, double wp, double q) { return fma((fma(0.16666666666666666, q, fma((0.5 * wp), wp, (fma(fma(0.001388888888888889, (w * w), -0.041666666666666664), (wp * wp), (q * fma((w * w), 0.0001984126984126984, -0.008333333333333333))) * (w * w)))) * w), w, -fma(wp, wp, q)); }
function code(w, wp, q) return fma(Float64(fma(0.16666666666666666, q, fma(Float64(0.5 * wp), wp, Float64(fma(fma(0.001388888888888889, Float64(w * w), -0.041666666666666664), Float64(wp * wp), Float64(q * fma(Float64(w * w), 0.0001984126984126984, -0.008333333333333333))) * Float64(w * w)))) * w), w, Float64(-fma(wp, wp, q))) end
code[w_, wp_, q_] := N[(N[(N[(0.16666666666666666 * q + N[(N[(0.5 * wp), $MachinePrecision] * wp + N[(N[(N[(0.001388888888888889 * N[(w * w), $MachinePrecision] + -0.041666666666666664), $MachinePrecision] * N[(wp * wp), $MachinePrecision] + N[(q * N[(N[(w * w), $MachinePrecision] * 0.0001984126984126984 + -0.008333333333333333), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[(w * w), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * w), $MachinePrecision] * w + (-N[(wp * wp + q), $MachinePrecision])), $MachinePrecision]
\begin{array}{l} \\ \mathsf{fma}\left(\mathsf{fma}\left(0.16666666666666666, q, \mathsf{fma}\left(0.5 \cdot wp, wp, \mathsf{fma}\left(\mathsf{fma}\left(0.001388888888888889, w \cdot w, -0.041666666666666664\right), wp \cdot wp, q \cdot \mathsf{fma}\left(w \cdot w, 0.0001984126984126984, -0.008333333333333333\right)\right) \cdot \left(w \cdot w\right)\right)\right) \cdot w, w, -\mathsf{fma}\left(wp, wp, q\right)\right) \end{array}
Initial program 100.0%
Taylor expanded in w around 0
Applied rewrites99.8%
(FPCore (w wp q) :precision binary64 (fma (* (fma (fma -0.041666666666666664 (* w w) 0.5) (* wp wp) (* q (fma (* w w) -0.008333333333333333 0.16666666666666666))) w) w (- (fma wp wp q))))
double code(double w, double wp, double q) { return fma((fma(fma(-0.041666666666666664, (w * w), 0.5), (wp * wp), (q * fma((w * w), -0.008333333333333333, 0.16666666666666666))) * w), w, -fma(wp, wp, q)); }
function code(w, wp, q) return fma(Float64(fma(fma(-0.041666666666666664, Float64(w * w), 0.5), Float64(wp * wp), Float64(q * fma(Float64(w * w), -0.008333333333333333, 0.16666666666666666))) * w), w, Float64(-fma(wp, wp, q))) end
code[w_, wp_, q_] := N[(N[(N[(N[(-0.041666666666666664 * N[(w * w), $MachinePrecision] + 0.5), $MachinePrecision] * N[(wp * wp), $MachinePrecision] + N[(q * N[(N[(w * w), $MachinePrecision] * -0.008333333333333333 + 0.16666666666666666), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * w), $MachinePrecision] * w + (-N[(wp * wp + q), $MachinePrecision])), $MachinePrecision]
\begin{array}{l} \\ \mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(-0.041666666666666664, w \cdot w, 0.5\right), wp \cdot wp, q \cdot \mathsf{fma}\left(w \cdot w, -0.008333333333333333, 0.16666666666666666\right)\right) \cdot w, w, -\mathsf{fma}\left(wp, wp, q\right)\right) \end{array}
Initial program 100.0%
Taylor expanded in w around 0
Applied rewrites99.7%
(FPCore (w wp q) :precision binary64 (fma (* (fma 0.16666666666666666 q (* 0.5 (* wp wp))) w) w (- (fma wp wp q))))
double code(double w, double wp, double q) { return fma((fma(0.16666666666666666, q, (0.5 * (wp * wp))) * w), w, -fma(wp, wp, q)); }
function code(w, wp, q) return fma(Float64(fma(0.16666666666666666, q, Float64(0.5 * Float64(wp * wp))) * w), w, Float64(-fma(wp, wp, q))) end
code[w_, wp_, q_] := N[(N[(N[(0.16666666666666666 * q + N[(0.5 * N[(wp * wp), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * w), $MachinePrecision] * w + (-N[(wp * wp + q), $MachinePrecision])), $MachinePrecision]
\begin{array}{l} \\ \mathsf{fma}\left(\mathsf{fma}\left(0.16666666666666666, q, 0.5 \cdot \left(wp \cdot wp\right)\right) \cdot w, w, -\mathsf{fma}\left(wp, wp, q\right)\right) \end{array}
Initial program 100.0%
Taylor expanded in w around 0
+-commutative
N/A
associate--l+
N/A
*-commutative
N/A
unpow2
N/A
associate-*r*
N/A
lower-fma.f64
N/A
lower-*.f64
N/A
sub-neg
N/A
+-commutative
N/A
distribute-lft-neg-in
N/A
metadata-eval
N/A
lower-fma.f64
N/A
lower-*.f64
N/A
unpow2
N/A
lower-*.f64
N/A
sub-neg
N/A
Applied rewrites99.5%
(FPCore (w wp q) :precision binary64 (- (fma wp wp q)))
double code(double w, double wp, double q) { return -fma(wp, wp, q); }
function code(w, wp, q) return Float64(-fma(wp, wp, q)) end
code[w_, wp_, q_] := (-N[(wp * wp + q), $MachinePrecision])
\begin{array}{l} \\ -\mathsf{fma}\left(wp, wp, q\right) \end{array}
Initial program 100.0%
Taylor expanded in w around 0
sub-neg
N/A
mul-1-neg
N/A
distribute-neg-out
N/A
lower-neg.f64
N/A
unpow2
N/A
lower-fma.f64
99.0
Applied rewrites99.0%
(FPCore (w wp q) :precision binary64 (- q))
double code(double w, double wp, double q) { return -q; }
real(8) function code(w, wp, q) real(8), intent (in) :: w real(8), intent (in) :: wp real(8), intent (in) :: q code = -q end function
public static double code(double w, double wp, double q) { return -q; }
def code(w, wp, q): return -q
function code(w, wp, q) return Float64(-q) end
function tmp = code(w, wp, q) tmp = -q; end
code[w_, wp_, q_] := (-q)
\begin{array}{l} \\ -q \end{array}
Initial program 100.0%
Taylor expanded in w around 0
sub-neg
N/A
mul-1-neg
N/A
distribute-neg-out
N/A
lower-neg.f64
N/A
unpow2
N/A
lower-fma.f64
99.0
Applied rewrites99.0%
Taylor expanded in wp around 0
Applied rewrites72.9%
herbie shell --seed 1
(FPCore (w wp q)
:name " -cos(w)*wp^2 - (sin(w)/w)*q"
:precision binary64
:pre (and (and (and (<= -1.0 w) (<= w 1.0)) (and (<= -1000.0 wp) (<= wp 1000.0))) (and (<= -1000.0 q) (<= q 1000.0)))
(- (* (- (cos w)) (pow wp 2.0)) (* (/ (sin w) w) q)))