
(FPCore (e v) :precision binary64 (/ (* e (sin v)) (+ 1.0 (* e (cos v)))))
double code(double e, double v) {
return (e * sin(v)) / (1.0 + (e * cos(v)));
}
real(8) function code(e, v)
real(8), intent (in) :: e
real(8), intent (in) :: v
code = (e * sin(v)) / (1.0d0 + (e * cos(v)))
end function
public static double code(double e, double v) {
return (e * Math.sin(v)) / (1.0 + (e * Math.cos(v)));
}
def code(e, v): return (e * math.sin(v)) / (1.0 + (e * math.cos(v)))
function code(e, v) return Float64(Float64(e * sin(v)) / Float64(1.0 + Float64(e * cos(v)))) end
function tmp = code(e, v) tmp = (e * sin(v)) / (1.0 + (e * cos(v))); end
code[e_, v_] := N[(N[(e * N[Sin[v], $MachinePrecision]), $MachinePrecision] / N[(1.0 + N[(e * N[Cos[v], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{e \cdot \sin v}{1 + e \cdot \cos v}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 13 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (e v) :precision binary64 (/ (* e (sin v)) (+ 1.0 (* e (cos v)))))
double code(double e, double v) {
return (e * sin(v)) / (1.0 + (e * cos(v)));
}
real(8) function code(e, v)
real(8), intent (in) :: e
real(8), intent (in) :: v
code = (e * sin(v)) / (1.0d0 + (e * cos(v)))
end function
public static double code(double e, double v) {
return (e * Math.sin(v)) / (1.0 + (e * Math.cos(v)));
}
def code(e, v): return (e * math.sin(v)) / (1.0 + (e * math.cos(v)))
function code(e, v) return Float64(Float64(e * sin(v)) / Float64(1.0 + Float64(e * cos(v)))) end
function tmp = code(e, v) tmp = (e * sin(v)) / (1.0 + (e * cos(v))); end
code[e_, v_] := N[(N[(e * N[Sin[v], $MachinePrecision]), $MachinePrecision] / N[(1.0 + N[(e * N[Cos[v], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{e \cdot \sin v}{1 + e \cdot \cos v}
\end{array}
(FPCore (e v) :precision binary64 (/ (* (sin v) (* e (- 1.0 (* e (cos v))))) (fma (+ 0.5 (* 0.5 (cos (+ v v)))) (* e (- e)) 1.0)))
double code(double e, double v) {
return (sin(v) * (e * (1.0 - (e * cos(v))))) / fma((0.5 + (0.5 * cos((v + v)))), (e * -e), 1.0);
}
function code(e, v) return Float64(Float64(sin(v) * Float64(e * Float64(1.0 - Float64(e * cos(v))))) / fma(Float64(0.5 + Float64(0.5 * cos(Float64(v + v)))), Float64(e * Float64(-e)), 1.0)) end
code[e_, v_] := N[(N[(N[Sin[v], $MachinePrecision] * N[(e * N[(1.0 - N[(e * N[Cos[v], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(N[(0.5 + N[(0.5 * N[Cos[N[(v + v), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[(e * (-e)), $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\sin v \cdot \left(e \cdot \left(1 - e \cdot \cos v\right)\right)}{\mathsf{fma}\left(0.5 + 0.5 \cdot \cos \left(v + v\right), e \cdot \left(-e\right), 1\right)}
\end{array}
Initial program 99.8%
lift-/.f64N/A
lift-+.f64N/A
flip-+N/A
associate-/r/N/A
associate-*l/N/A
lower-/.f64N/A
lift-*.f64N/A
*-commutativeN/A
associate-*l*N/A
lower-*.f64N/A
lower-*.f64N/A
lower--.f64N/A
metadata-evalN/A
sub-negN/A
+-commutativeN/A
Applied rewrites99.9%
Final simplification99.9%
(FPCore (e v) :precision binary64 (* e (* (/ (sin v) (fma (fma 0.5 (cos (+ v v)) 0.5) (* e e) -1.0)) (fma e (cos v) -1.0))))
double code(double e, double v) {
return e * ((sin(v) / fma(fma(0.5, cos((v + v)), 0.5), (e * e), -1.0)) * fma(e, cos(v), -1.0));
}
function code(e, v) return Float64(e * Float64(Float64(sin(v) / fma(fma(0.5, cos(Float64(v + v)), 0.5), Float64(e * e), -1.0)) * fma(e, cos(v), -1.0))) end
code[e_, v_] := N[(e * N[(N[(N[Sin[v], $MachinePrecision] / N[(N[(0.5 * N[Cos[N[(v + v), $MachinePrecision]], $MachinePrecision] + 0.5), $MachinePrecision] * N[(e * e), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision] * N[(e * N[Cos[v], $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
e \cdot \left(\frac{\sin v}{\mathsf{fma}\left(\mathsf{fma}\left(0.5, \cos \left(v + v\right), 0.5\right), e \cdot e, -1\right)} \cdot \mathsf{fma}\left(e, \cos v, -1\right)\right)
\end{array}
Initial program 99.8%
lift-/.f64N/A
lift-*.f64N/A
associate-/l*N/A
*-commutativeN/A
lower-*.f64N/A
lower-/.f6499.8
lift-+.f64N/A
+-commutativeN/A
lift-*.f64N/A
lower-fma.f6499.8
Applied rewrites99.8%
lift-/.f64N/A
lift-fma.f64N/A
lift-*.f64N/A
flip-+N/A
associate-/r/N/A
lower-*.f64N/A
Applied rewrites99.8%
Final simplification99.8%
(FPCore (e v) :precision binary64 (* e (/ (sin v) (fma e (cos v) 1.0))))
double code(double e, double v) {
return e * (sin(v) / fma(e, cos(v), 1.0));
}
function code(e, v) return Float64(e * Float64(sin(v) / fma(e, cos(v), 1.0))) end
code[e_, v_] := N[(e * N[(N[Sin[v], $MachinePrecision] / N[(e * N[Cos[v], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
e \cdot \frac{\sin v}{\mathsf{fma}\left(e, \cos v, 1\right)}
\end{array}
Initial program 99.8%
lift-/.f64N/A
lift-*.f64N/A
associate-/l*N/A
*-commutativeN/A
lower-*.f64N/A
lower-/.f6499.8
lift-+.f64N/A
+-commutativeN/A
lift-*.f64N/A
lower-fma.f6499.8
Applied rewrites99.8%
Final simplification99.8%
(FPCore (e v) :precision binary64 (/ (* (sin v) e) (+ e 1.0)))
double code(double e, double v) {
return (sin(v) * e) / (e + 1.0);
}
real(8) function code(e, v)
real(8), intent (in) :: e
real(8), intent (in) :: v
code = (sin(v) * e) / (e + 1.0d0)
end function
public static double code(double e, double v) {
return (Math.sin(v) * e) / (e + 1.0);
}
def code(e, v): return (math.sin(v) * e) / (e + 1.0)
function code(e, v) return Float64(Float64(sin(v) * e) / Float64(e + 1.0)) end
function tmp = code(e, v) tmp = (sin(v) * e) / (e + 1.0); end
code[e_, v_] := N[(N[(N[Sin[v], $MachinePrecision] * e), $MachinePrecision] / N[(e + 1.0), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\sin v \cdot e}{e + 1}
\end{array}
Initial program 99.8%
Taylor expanded in v around 0
lower-+.f6499.5
Applied rewrites99.5%
Final simplification99.5%
(FPCore (e v) :precision binary64 (* e (/ (sin v) (+ e 1.0))))
double code(double e, double v) {
return e * (sin(v) / (e + 1.0));
}
real(8) function code(e, v)
real(8), intent (in) :: e
real(8), intent (in) :: v
code = e * (sin(v) / (e + 1.0d0))
end function
public static double code(double e, double v) {
return e * (Math.sin(v) / (e + 1.0));
}
def code(e, v): return e * (math.sin(v) / (e + 1.0))
function code(e, v) return Float64(e * Float64(sin(v) / Float64(e + 1.0))) end
function tmp = code(e, v) tmp = e * (sin(v) / (e + 1.0)); end
code[e_, v_] := N[(e * N[(N[Sin[v], $MachinePrecision] / N[(e + 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
e \cdot \frac{\sin v}{e + 1}
\end{array}
Initial program 99.8%
lift-/.f64N/A
lift-*.f64N/A
associate-/l*N/A
*-commutativeN/A
lower-*.f64N/A
lower-/.f6499.8
lift-+.f64N/A
+-commutativeN/A
lift-*.f64N/A
lower-fma.f6499.8
Applied rewrites99.8%
Taylor expanded in v around 0
+-commutativeN/A
lower-+.f6499.5
Applied rewrites99.5%
Final simplification99.5%
(FPCore (e v) :precision binary64 (* (sin v) e))
double code(double e, double v) {
return sin(v) * e;
}
real(8) function code(e, v)
real(8), intent (in) :: e
real(8), intent (in) :: v
code = sin(v) * e
end function
public static double code(double e, double v) {
return Math.sin(v) * e;
}
def code(e, v): return math.sin(v) * e
function code(e, v) return Float64(sin(v) * e) end
function tmp = code(e, v) tmp = sin(v) * e; end
code[e_, v_] := N[(N[Sin[v], $MachinePrecision] * e), $MachinePrecision]
\begin{array}{l}
\\
\sin v \cdot e
\end{array}
Initial program 99.8%
Taylor expanded in e around 0
lower-*.f64N/A
lower-sin.f6498.1
Applied rewrites98.1%
Final simplification98.1%
(FPCore (e v)
:precision binary64
(/
(* v e)
(+
1.0
(fma
(* v v)
(fma
e
-0.5
(*
(* e (* v v))
(fma (* v v) -0.001388888888888889 0.041666666666666664)))
e))))
double code(double e, double v) {
return (v * e) / (1.0 + fma((v * v), fma(e, -0.5, ((e * (v * v)) * fma((v * v), -0.001388888888888889, 0.041666666666666664))), e));
}
function code(e, v) return Float64(Float64(v * e) / Float64(1.0 + fma(Float64(v * v), fma(e, -0.5, Float64(Float64(e * Float64(v * v)) * fma(Float64(v * v), -0.001388888888888889, 0.041666666666666664))), e))) end
code[e_, v_] := N[(N[(v * e), $MachinePrecision] / N[(1.0 + N[(N[(v * v), $MachinePrecision] * N[(e * -0.5 + N[(N[(e * N[(v * v), $MachinePrecision]), $MachinePrecision] * N[(N[(v * v), $MachinePrecision] * -0.001388888888888889 + 0.041666666666666664), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + e), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{v \cdot e}{1 + \mathsf{fma}\left(v \cdot v, \mathsf{fma}\left(e, -0.5, \left(e \cdot \left(v \cdot v\right)\right) \cdot \mathsf{fma}\left(v \cdot v, -0.001388888888888889, 0.041666666666666664\right)\right), e\right)}
\end{array}
Initial program 99.8%
Taylor expanded in v around 0
+-commutativeN/A
lower-fma.f64N/A
Applied rewrites59.7%
Taylor expanded in v around 0
lower-*.f6455.4
Applied rewrites55.4%
Final simplification55.4%
(FPCore (e v) :precision binary64 (* (/ (* v e) (- 1.0 (* e e))) (- 1.0 e)))
double code(double e, double v) {
return ((v * e) / (1.0 - (e * e))) * (1.0 - e);
}
real(8) function code(e, v)
real(8), intent (in) :: e
real(8), intent (in) :: v
code = ((v * e) / (1.0d0 - (e * e))) * (1.0d0 - e)
end function
public static double code(double e, double v) {
return ((v * e) / (1.0 - (e * e))) * (1.0 - e);
}
def code(e, v): return ((v * e) / (1.0 - (e * e))) * (1.0 - e)
function code(e, v) return Float64(Float64(Float64(v * e) / Float64(1.0 - Float64(e * e))) * Float64(1.0 - e)) end
function tmp = code(e, v) tmp = ((v * e) / (1.0 - (e * e))) * (1.0 - e); end
code[e_, v_] := N[(N[(N[(v * e), $MachinePrecision] / N[(1.0 - N[(e * e), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[(1.0 - e), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{v \cdot e}{1 - e \cdot e} \cdot \left(1 - e\right)
\end{array}
Initial program 99.8%
Taylor expanded in v around 0
*-commutativeN/A
associate-*r/N/A
lower-*.f64N/A
lower-/.f64N/A
lower-+.f6454.8
Applied rewrites54.8%
Applied rewrites54.8%
(FPCore (e v) :precision binary64 (/ (* v e) (+ e 1.0)))
double code(double e, double v) {
return (v * e) / (e + 1.0);
}
real(8) function code(e, v)
real(8), intent (in) :: e
real(8), intent (in) :: v
code = (v * e) / (e + 1.0d0)
end function
public static double code(double e, double v) {
return (v * e) / (e + 1.0);
}
def code(e, v): return (v * e) / (e + 1.0)
function code(e, v) return Float64(Float64(v * e) / Float64(e + 1.0)) end
function tmp = code(e, v) tmp = (v * e) / (e + 1.0); end
code[e_, v_] := N[(N[(v * e), $MachinePrecision] / N[(e + 1.0), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{v \cdot e}{e + 1}
\end{array}
Initial program 99.8%
Taylor expanded in v around 0
*-commutativeN/A
associate-*r/N/A
lower-*.f64N/A
lower-/.f64N/A
lower-+.f6454.8
Applied rewrites54.8%
Applied rewrites54.8%
(FPCore (e v) :precision binary64 (* v (/ e (+ e 1.0))))
double code(double e, double v) {
return v * (e / (e + 1.0));
}
real(8) function code(e, v)
real(8), intent (in) :: e
real(8), intent (in) :: v
code = v * (e / (e + 1.0d0))
end function
public static double code(double e, double v) {
return v * (e / (e + 1.0));
}
def code(e, v): return v * (e / (e + 1.0))
function code(e, v) return Float64(v * Float64(e / Float64(e + 1.0))) end
function tmp = code(e, v) tmp = v * (e / (e + 1.0)); end
code[e_, v_] := N[(v * N[(e / N[(e + 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
v \cdot \frac{e}{e + 1}
\end{array}
Initial program 99.8%
Taylor expanded in v around 0
*-commutativeN/A
associate-*r/N/A
lower-*.f64N/A
lower-/.f64N/A
lower-+.f6454.8
Applied rewrites54.8%
Final simplification54.8%
(FPCore (e v) :precision binary64 (* e (fma e (- (* v e) v) v)))
double code(double e, double v) {
return e * fma(e, ((v * e) - v), v);
}
function code(e, v) return Float64(e * fma(e, Float64(Float64(v * e) - v), v)) end
code[e_, v_] := N[(e * N[(e * N[(N[(v * e), $MachinePrecision] - v), $MachinePrecision] + v), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
e \cdot \mathsf{fma}\left(e, v \cdot e - v, v\right)
\end{array}
Initial program 99.8%
Taylor expanded in v around 0
*-commutativeN/A
associate-*r/N/A
lower-*.f64N/A
lower-/.f64N/A
lower-+.f6454.8
Applied rewrites54.8%
Taylor expanded in e around 0
Applied rewrites54.5%
Final simplification54.5%
(FPCore (e v) :precision binary64 (* e (- v (* v e))))
double code(double e, double v) {
return e * (v - (v * e));
}
real(8) function code(e, v)
real(8), intent (in) :: e
real(8), intent (in) :: v
code = e * (v - (v * e))
end function
public static double code(double e, double v) {
return e * (v - (v * e));
}
def code(e, v): return e * (v - (v * e))
function code(e, v) return Float64(e * Float64(v - Float64(v * e))) end
function tmp = code(e, v) tmp = e * (v - (v * e)); end
code[e_, v_] := N[(e * N[(v - N[(v * e), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
e \cdot \left(v - v \cdot e\right)
\end{array}
Initial program 99.8%
Taylor expanded in v around 0
*-commutativeN/A
associate-*r/N/A
lower-*.f64N/A
lower-/.f64N/A
lower-+.f6454.8
Applied rewrites54.8%
Taylor expanded in e around 0
Applied rewrites53.4%
Taylor expanded in e around 0
Applied rewrites54.2%
Final simplification54.2%
(FPCore (e v) :precision binary64 (* v e))
double code(double e, double v) {
return v * e;
}
real(8) function code(e, v)
real(8), intent (in) :: e
real(8), intent (in) :: v
code = v * e
end function
public static double code(double e, double v) {
return v * e;
}
def code(e, v): return v * e
function code(e, v) return Float64(v * e) end
function tmp = code(e, v) tmp = v * e; end
code[e_, v_] := N[(v * e), $MachinePrecision]
\begin{array}{l}
\\
v \cdot e
\end{array}
Initial program 99.8%
Taylor expanded in v around 0
*-commutativeN/A
associate-*r/N/A
lower-*.f64N/A
lower-/.f64N/A
lower-+.f6454.8
Applied rewrites54.8%
Taylor expanded in e around 0
Applied rewrites53.4%
Final simplification53.4%
herbie shell --seed 2024223
(FPCore (e v)
:name "Trigonometry A"
:precision binary64
:pre (and (<= 0.0 e) (<= e 1.0))
(/ (* e (sin v)) (+ 1.0 (* e (cos v)))))