
(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 6 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 (asin (/ (+ 1.0 (* (pow v 2.0) -5.0)) (fma v v -1.0))))
(t_1 (cbrt (acos (/ (fma (pow v 2.0) -5.0 1.0) (fma v v -1.0)))))
(t_2 (pow t_1 2.0))
(t_3 (* t_1 t_2)))
(/
(- (* (pow PI 3.0) 0.125) (pow t_0 3.0))
(+
(* (* PI PI) 0.25)
(*
t_0
(+
(fma (pow (cbrt PI) 2.0) (cbrt PI) (- t_3))
(fma (- t_1) t_2 t_3)))))))
double code(double v) {
double t_0 = asin(((1.0 + (pow(v, 2.0) * -5.0)) / fma(v, v, -1.0)));
double t_1 = cbrt(acos((fma(pow(v, 2.0), -5.0, 1.0) / fma(v, v, -1.0))));
double t_2 = pow(t_1, 2.0);
double t_3 = t_1 * t_2;
return ((pow(((double) M_PI), 3.0) * 0.125) - pow(t_0, 3.0)) / (((((double) M_PI) * ((double) M_PI)) * 0.25) + (t_0 * (fma(pow(cbrt(((double) M_PI)), 2.0), cbrt(((double) M_PI)), -t_3) + fma(-t_1, t_2, t_3))));
}
function code(v) t_0 = asin(Float64(Float64(1.0 + Float64((v ^ 2.0) * -5.0)) / fma(v, v, -1.0))) t_1 = cbrt(acos(Float64(fma((v ^ 2.0), -5.0, 1.0) / fma(v, v, -1.0)))) t_2 = t_1 ^ 2.0 t_3 = Float64(t_1 * t_2) return Float64(Float64(Float64((pi ^ 3.0) * 0.125) - (t_0 ^ 3.0)) / Float64(Float64(Float64(pi * pi) * 0.25) + Float64(t_0 * Float64(fma((cbrt(pi) ^ 2.0), cbrt(pi), Float64(-t_3)) + fma(Float64(-t_1), t_2, t_3))))) end
code[v_] := Block[{t$95$0 = N[ArcSin[N[(N[(1.0 + N[(N[Power[v, 2.0], $MachinePrecision] * -5.0), $MachinePrecision]), $MachinePrecision] / N[(v * v + -1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]}, Block[{t$95$1 = N[Power[N[ArcCos[N[(N[(N[Power[v, 2.0], $MachinePrecision] * -5.0 + 1.0), $MachinePrecision] / N[(v * v + -1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision], 1/3], $MachinePrecision]}, Block[{t$95$2 = N[Power[t$95$1, 2.0], $MachinePrecision]}, Block[{t$95$3 = N[(t$95$1 * t$95$2), $MachinePrecision]}, N[(N[(N[(N[Power[Pi, 3.0], $MachinePrecision] * 0.125), $MachinePrecision] - N[Power[t$95$0, 3.0], $MachinePrecision]), $MachinePrecision] / N[(N[(N[(Pi * Pi), $MachinePrecision] * 0.25), $MachinePrecision] + N[(t$95$0 * N[(N[(N[Power[N[Power[Pi, 1/3], $MachinePrecision], 2.0], $MachinePrecision] * N[Power[Pi, 1/3], $MachinePrecision] + (-t$95$3)), $MachinePrecision] + N[((-t$95$1) * t$95$2 + t$95$3), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \sin^{-1} \left(\frac{1 + {v}^{2} \cdot -5}{\mathsf{fma}\left(v, v, -1\right)}\right)\\
t_1 := \sqrt[3]{\cos^{-1} \left(\frac{\mathsf{fma}\left({v}^{2}, -5, 1\right)}{\mathsf{fma}\left(v, v, -1\right)}\right)}\\
t_2 := {t_1}^{2}\\
t_3 := t_1 \cdot t_2\\
\frac{{\pi}^{3} \cdot 0.125 - {t_0}^{3}}{\left(\pi \cdot \pi\right) \cdot 0.25 + t_0 \cdot \left(\mathsf{fma}\left({\left(\sqrt[3]{\pi}\right)}^{2}, \sqrt[3]{\pi}, -t_3\right) + \mathsf{fma}\left(-t_1, t_2, t_3\right)\right)}
\end{array}
\end{array}
Initial program 99.3%
acos-asin99.3%
flip3--99.4%
Applied egg-rr99.4%
cube-prod99.4%
metadata-eval99.4%
cancel-sign-sub-inv99.4%
metadata-eval99.4%
*-commutative99.4%
Simplified99.4%
fma-udef99.4%
add-sqr-sqrt97.9%
sqrt-prod99.4%
metadata-eval99.4%
sqrt-prod99.4%
asin-acos99.4%
div-inv99.4%
metadata-eval99.4%
add-sqr-sqrt97.9%
sqrt-prod99.4%
metadata-eval99.4%
sqrt-prod99.4%
*-commutative99.4%
metadata-eval99.4%
cancel-sign-sub-inv99.4%
Applied egg-rr99.4%
distribute-lft-out99.4%
metadata-eval99.4%
*-rgt-identity99.4%
Simplified99.4%
add-cube-cbrt95.9%
add-cube-cbrt99.4%
prod-diff99.4%
Applied egg-rr99.4%
Final simplification99.4%
(FPCore (v)
:precision binary64
(let* ((t_0 (asin (/ (+ 1.0 (* (pow v 2.0) -5.0)) (fma v v -1.0)))))
(/
(- (* (pow PI 3.0) 0.125) (pow t_0 3.0))
(+
(* (* PI PI) 0.25)
(* t_0 (- PI (acos (/ (fma (pow v 2.0) -5.0 1.0) (fma v v -1.0)))))))))
double code(double v) {
double t_0 = asin(((1.0 + (pow(v, 2.0) * -5.0)) / fma(v, v, -1.0)));
return ((pow(((double) M_PI), 3.0) * 0.125) - pow(t_0, 3.0)) / (((((double) M_PI) * ((double) M_PI)) * 0.25) + (t_0 * (((double) M_PI) - acos((fma(pow(v, 2.0), -5.0, 1.0) / fma(v, v, -1.0))))));
}
function code(v) t_0 = asin(Float64(Float64(1.0 + Float64((v ^ 2.0) * -5.0)) / fma(v, v, -1.0))) return Float64(Float64(Float64((pi ^ 3.0) * 0.125) - (t_0 ^ 3.0)) / Float64(Float64(Float64(pi * pi) * 0.25) + Float64(t_0 * Float64(pi - acos(Float64(fma((v ^ 2.0), -5.0, 1.0) / fma(v, v, -1.0))))))) end
code[v_] := Block[{t$95$0 = N[ArcSin[N[(N[(1.0 + N[(N[Power[v, 2.0], $MachinePrecision] * -5.0), $MachinePrecision]), $MachinePrecision] / N[(v * v + -1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]}, N[(N[(N[(N[Power[Pi, 3.0], $MachinePrecision] * 0.125), $MachinePrecision] - N[Power[t$95$0, 3.0], $MachinePrecision]), $MachinePrecision] / N[(N[(N[(Pi * Pi), $MachinePrecision] * 0.25), $MachinePrecision] + N[(t$95$0 * N[(Pi - N[ArcCos[N[(N[(N[Power[v, 2.0], $MachinePrecision] * -5.0 + 1.0), $MachinePrecision] / N[(v * v + -1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \sin^{-1} \left(\frac{1 + {v}^{2} \cdot -5}{\mathsf{fma}\left(v, v, -1\right)}\right)\\
\frac{{\pi}^{3} \cdot 0.125 - {t_0}^{3}}{\left(\pi \cdot \pi\right) \cdot 0.25 + t_0 \cdot \left(\pi - \cos^{-1} \left(\frac{\mathsf{fma}\left({v}^{2}, -5, 1\right)}{\mathsf{fma}\left(v, v, -1\right)}\right)\right)}
\end{array}
\end{array}
Initial program 99.3%
acos-asin99.3%
flip3--99.4%
Applied egg-rr99.4%
cube-prod99.4%
metadata-eval99.4%
cancel-sign-sub-inv99.4%
metadata-eval99.4%
*-commutative99.4%
Simplified99.4%
fma-udef99.4%
add-sqr-sqrt97.9%
sqrt-prod99.4%
metadata-eval99.4%
sqrt-prod99.4%
asin-acos99.4%
div-inv99.4%
metadata-eval99.4%
add-sqr-sqrt97.9%
sqrt-prod99.4%
metadata-eval99.4%
sqrt-prod99.4%
*-commutative99.4%
metadata-eval99.4%
cancel-sign-sub-inv99.4%
Applied egg-rr99.4%
distribute-lft-out99.4%
metadata-eval99.4%
*-rgt-identity99.4%
Simplified99.4%
Final simplification99.4%
(FPCore (v)
:precision binary64
(let* ((t_0
(cbrt (log (acos (/ (fma (pow v 2.0) -5.0 1.0) (fma v v -1.0)))))))
(exp (* t_0 (pow (pow (cbrt t_0) 2.0) 3.0)))))
double code(double v) {
double t_0 = cbrt(log(acos((fma(pow(v, 2.0), -5.0, 1.0) / fma(v, v, -1.0)))));
return exp((t_0 * pow(pow(cbrt(t_0), 2.0), 3.0)));
}
function code(v) t_0 = cbrt(log(acos(Float64(fma((v ^ 2.0), -5.0, 1.0) / fma(v, v, -1.0))))) return exp(Float64(t_0 * ((cbrt(t_0) ^ 2.0) ^ 3.0))) end
code[v_] := Block[{t$95$0 = N[Power[N[Log[N[ArcCos[N[(N[(N[Power[v, 2.0], $MachinePrecision] * -5.0 + 1.0), $MachinePrecision] / N[(v * v + -1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision], 1/3], $MachinePrecision]}, N[Exp[N[(t$95$0 * N[Power[N[Power[N[Power[t$95$0, 1/3], $MachinePrecision], 2.0], $MachinePrecision], 3.0], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \sqrt[3]{\log \cos^{-1} \left(\frac{\mathsf{fma}\left({v}^{2}, -5, 1\right)}{\mathsf{fma}\left(v, v, -1\right)}\right)}\\
e^{t_0 \cdot {\left({\left(\sqrt[3]{t_0}\right)}^{2}\right)}^{3}}
\end{array}
\end{array}
Initial program 99.3%
add-exp-log99.3%
pow299.3%
fma-neg99.3%
metadata-eval99.3%
Applied egg-rr99.3%
add-cube-cbrt95.5%
pow395.5%
cancel-sign-sub-inv95.5%
metadata-eval95.5%
*-commutative95.5%
+-commutative95.5%
fma-def95.5%
Applied egg-rr95.5%
add-cube-cbrt99.4%
unpow-prod-down97.9%
pow297.9%
pow397.9%
add-cube-cbrt99.4%
Applied egg-rr99.4%
Final simplification99.4%
(FPCore (v) :precision binary64 (exp (log (acos (/ (- 1.0 (log (pow (exp 5.0) (pow v 2.0)))) (fma v v -1.0))))))
double code(double v) {
return exp(log(acos(((1.0 - log(pow(exp(5.0), pow(v, 2.0)))) / fma(v, v, -1.0)))));
}
function code(v) return exp(log(acos(Float64(Float64(1.0 - log((exp(5.0) ^ (v ^ 2.0)))) / fma(v, v, -1.0))))) end
code[v_] := N[Exp[N[Log[N[ArcCos[N[(N[(1.0 - N[Log[N[Power[N[Exp[5.0], $MachinePrecision], N[Power[v, 2.0], $MachinePrecision]], $MachinePrecision]], $MachinePrecision]), $MachinePrecision] / N[(v * v + -1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]], $MachinePrecision]
\begin{array}{l}
\\
e^{\log \cos^{-1} \left(\frac{1 - \log \left({\left(e^{5}\right)}^{\left({v}^{2}\right)}\right)}{\mathsf{fma}\left(v, v, -1\right)}\right)}
\end{array}
Initial program 99.3%
add-exp-log99.3%
pow299.3%
fma-neg99.3%
metadata-eval99.3%
Applied egg-rr99.3%
add-log-exp99.3%
exp-prod99.3%
Applied egg-rr99.3%
Final simplification99.3%
(FPCore (v) :precision binary64 (acos (/ (- 1.0 (* 5.0 (* v v))) (+ -1.0 (* v v)))))
double code(double v) {
return acos(((1.0 - (5.0 * (v * v))) / (-1.0 + (v * v))));
}
real(8) function code(v)
real(8), intent (in) :: v
code = acos(((1.0d0 - (5.0d0 * (v * v))) / ((-1.0d0) + (v * v))))
end function
public static double code(double v) {
return Math.acos(((1.0 - (5.0 * (v * v))) / (-1.0 + (v * v))));
}
def code(v): return math.acos(((1.0 - (5.0 * (v * v))) / (-1.0 + (v * v))))
function code(v) return acos(Float64(Float64(1.0 - Float64(5.0 * Float64(v * v))) / Float64(-1.0 + Float64(v * v)))) end
function tmp = code(v) tmp = acos(((1.0 - (5.0 * (v * v))) / (-1.0 + (v * v)))); end
code[v_] := N[ArcCos[N[(N[(1.0 - N[(5.0 * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(-1.0 + N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\begin{array}{l}
\\
\cos^{-1} \left(\frac{1 - 5 \cdot \left(v \cdot v\right)}{-1 + v \cdot v}\right)
\end{array}
Initial program 99.3%
Final simplification99.3%
(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 99.3%
Taylor expanded in v around 0 98.1%
Final simplification98.1%
herbie shell --seed 2023309
(FPCore (v)
:name "Falkner and Boettcher, Appendix B, 1"
:precision binary64
(acos (/ (- 1.0 (* 5.0 (* v v))) (- (* v v) 1.0))))