
(FPCore (v) :precision binary64 (acos (/ (- 1.0 (* 5.0 (* v v))) (- (* v v) 1.0))))
double code(double v) {
return acos(((1.0 - (5.0 * (v * v))) / ((v * v) - 1.0)));
}
real(8) function code(v)
real(8), intent (in) :: v
code = acos(((1.0d0 - (5.0d0 * (v * v))) / ((v * v) - 1.0d0)))
end function
public static double code(double v) {
return Math.acos(((1.0 - (5.0 * (v * v))) / ((v * v) - 1.0)));
}
def code(v): return math.acos(((1.0 - (5.0 * (v * v))) / ((v * v) - 1.0)))
function code(v) return acos(Float64(Float64(1.0 - Float64(5.0 * Float64(v * v))) / Float64(Float64(v * v) - 1.0))) end
function tmp = code(v) tmp = acos(((1.0 - (5.0 * (v * v))) / ((v * v) - 1.0))); end
code[v_] := N[ArcCos[N[(N[(1.0 - N[(5.0 * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(N[(v * v), $MachinePrecision] - 1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\begin{array}{l}
\\
\cos^{-1} \left(\frac{1 - 5 \cdot \left(v \cdot v\right)}{v \cdot v - 1}\right)
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 4 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (v) :precision binary64 (acos (/ (- 1.0 (* 5.0 (* v v))) (- (* v v) 1.0))))
double code(double v) {
return acos(((1.0 - (5.0 * (v * v))) / ((v * v) - 1.0)));
}
real(8) function code(v)
real(8), intent (in) :: v
code = acos(((1.0d0 - (5.0d0 * (v * v))) / ((v * v) - 1.0d0)))
end function
public static double code(double v) {
return Math.acos(((1.0 - (5.0 * (v * v))) / ((v * v) - 1.0)));
}
def code(v): return math.acos(((1.0 - (5.0 * (v * v))) / ((v * v) - 1.0)))
function code(v) return acos(Float64(Float64(1.0 - Float64(5.0 * Float64(v * v))) / Float64(Float64(v * v) - 1.0))) end
function tmp = code(v) tmp = acos(((1.0 - (5.0 * (v * v))) / ((v * v) - 1.0))); end
code[v_] := N[ArcCos[N[(N[(1.0 - N[(5.0 * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(N[(v * v), $MachinePrecision] - 1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\begin{array}{l}
\\
\cos^{-1} \left(\frac{1 - 5 \cdot \left(v \cdot v\right)}{v \cdot v - 1}\right)
\end{array}
(FPCore (v)
:precision binary64
(let* ((t_0
(cbrt (log1p (acos (/ (- 1.0 (* 5.0 (* v v))) (+ (* v v) -1.0))))))
(t_1 (* t_0 t_0)))
(expm1 (* t_0 (cbrt (* t_1 (* t_1 t_1)))))))
double code(double v) {
double t_0 = cbrt(log1p(acos(((1.0 - (5.0 * (v * v))) / ((v * v) + -1.0)))));
double t_1 = t_0 * t_0;
return expm1((t_0 * cbrt((t_1 * (t_1 * t_1)))));
}
public static double code(double v) {
double t_0 = Math.cbrt(Math.log1p(Math.acos(((1.0 - (5.0 * (v * v))) / ((v * v) + -1.0)))));
double t_1 = t_0 * t_0;
return Math.expm1((t_0 * Math.cbrt((t_1 * (t_1 * t_1)))));
}
function code(v) t_0 = cbrt(log1p(acos(Float64(Float64(1.0 - Float64(5.0 * Float64(v * v))) / Float64(Float64(v * v) + -1.0))))) t_1 = Float64(t_0 * t_0) return expm1(Float64(t_0 * cbrt(Float64(t_1 * Float64(t_1 * t_1))))) end
code[v_] := Block[{t$95$0 = N[Power[N[Log[1 + N[ArcCos[N[(N[(1.0 - N[(5.0 * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(N[(v * v), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision], 1/3], $MachinePrecision]}, Block[{t$95$1 = N[(t$95$0 * t$95$0), $MachinePrecision]}, N[(Exp[N[(t$95$0 * N[Power[N[(t$95$1 * N[(t$95$1 * t$95$1), $MachinePrecision]), $MachinePrecision], 1/3], $MachinePrecision]), $MachinePrecision]] - 1), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \sqrt[3]{\mathsf{log1p}\left(\cos^{-1} \left(\frac{1 - 5 \cdot \left(v \cdot v\right)}{v \cdot v + -1}\right)\right)}\\
t_1 := t_0 \cdot t_0\\
\mathsf{expm1}\left(t_0 \cdot \sqrt[3]{t_1 \cdot \left(t_1 \cdot t_1\right)}\right)
\end{array}
\end{array}
Initial program 98.9%
expm1-log1p-u_binary6498.9%
Applied rewrite-once98.9%
add-cube-cbrt_binary6494.8%
Applied rewrite-once94.8%
add-cbrt-cube_binary6499.0%
Applied rewrite-once99.0%
Final simplification99.0%
(FPCore (v) :precision binary64 (expm1 (log1p (acos (/ (- 1.0 (* 5.0 (* v v))) (+ (* v v) -1.0))))))
double code(double v) {
return expm1(log1p(acos(((1.0 - (5.0 * (v * v))) / ((v * v) + -1.0)))));
}
public static double code(double v) {
return Math.expm1(Math.log1p(Math.acos(((1.0 - (5.0 * (v * v))) / ((v * v) + -1.0)))));
}
def code(v): return math.expm1(math.log1p(math.acos(((1.0 - (5.0 * (v * v))) / ((v * v) + -1.0)))))
function code(v) return expm1(log1p(acos(Float64(Float64(1.0 - Float64(5.0 * Float64(v * v))) / Float64(Float64(v * v) + -1.0))))) end
code[v_] := N[(Exp[N[Log[1 + N[ArcCos[N[(N[(1.0 - N[(5.0 * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(N[(v * v), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]] - 1), $MachinePrecision]
\begin{array}{l}
\\
\mathsf{expm1}\left(\mathsf{log1p}\left(\cos^{-1} \left(\frac{1 - 5 \cdot \left(v \cdot v\right)}{v \cdot v + -1}\right)\right)\right)
\end{array}
Initial program 98.9%
expm1-log1p-u_binary6498.9%
Applied rewrite-once98.9%
Final simplification98.9%
(FPCore (v) :precision binary64 (acos (/ (- 1.0 (* 5.0 (* v v))) (+ (* v v) -1.0))))
double code(double v) {
return acos(((1.0 - (5.0 * (v * v))) / ((v * v) + -1.0)));
}
real(8) function code(v)
real(8), intent (in) :: v
code = acos(((1.0d0 - (5.0d0 * (v * v))) / ((v * v) + (-1.0d0))))
end function
public static double code(double v) {
return Math.acos(((1.0 - (5.0 * (v * v))) / ((v * v) + -1.0)));
}
def code(v): return math.acos(((1.0 - (5.0 * (v * v))) / ((v * v) + -1.0)))
function code(v) return acos(Float64(Float64(1.0 - Float64(5.0 * Float64(v * v))) / Float64(Float64(v * v) + -1.0))) end
function tmp = code(v) tmp = acos(((1.0 - (5.0 * (v * v))) / ((v * v) + -1.0))); end
code[v_] := N[ArcCos[N[(N[(1.0 - N[(5.0 * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(N[(v * v), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\begin{array}{l}
\\
\cos^{-1} \left(\frac{1 - 5 \cdot \left(v \cdot v\right)}{v \cdot v + -1}\right)
\end{array}
Initial program 98.9%
Final simplification98.9%
(FPCore (v) :precision binary64 (acos -1.0))
double code(double v) {
return acos(-1.0);
}
real(8) function code(v)
real(8), intent (in) :: v
code = acos((-1.0d0))
end function
public static double code(double v) {
return Math.acos(-1.0);
}
def code(v): return math.acos(-1.0)
function code(v) return acos(-1.0) end
function tmp = code(v) tmp = acos(-1.0); end
code[v_] := N[ArcCos[-1.0], $MachinePrecision]
\begin{array}{l}
\\
\cos^{-1} -1
\end{array}
Initial program 98.9%
Taylor expanded in v around 0 97.5%
Final simplification97.5%
herbie shell --seed 2023297
(FPCore (v)
:name "Falkner and Boettcher, Appendix B, 1"
:precision binary64
(acos (/ (- 1.0 (* 5.0 (* v v))) (- (* v v) 1.0))))