
(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 7 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 (asin (/ (- 1.0 (* 5.0 (pow v 2.0))) (fma v v -1.0)))))
(t_1 (- t_0)))
(+
(fma PI 0.5 (* t_0 (* t_0 t_1)))
(fma
t_1
(*
t_0
(cbrt
(asin
(+
-1.0
(*
(pow v 2.0)
(+ 4.0 (* (pow v 2.0) (+ 4.0 (* (pow v 2.0) 4.0)))))))))
(*
t_0
(pow
(pow
(cbrt (cbrt (asin (/ (+ 1.0 (* (pow v 2.0) -5.0)) (fma v v -1.0)))))
2.0)
3.0))))))
double code(double v) {
double t_0 = cbrt(asin(((1.0 - (5.0 * pow(v, 2.0))) / fma(v, v, -1.0))));
double t_1 = -t_0;
return fma(((double) M_PI), 0.5, (t_0 * (t_0 * t_1))) + fma(t_1, (t_0 * cbrt(asin((-1.0 + (pow(v, 2.0) * (4.0 + (pow(v, 2.0) * (4.0 + (pow(v, 2.0) * 4.0))))))))), (t_0 * pow(pow(cbrt(cbrt(asin(((1.0 + (pow(v, 2.0) * -5.0)) / fma(v, v, -1.0))))), 2.0), 3.0)));
}
function code(v) t_0 = cbrt(asin(Float64(Float64(1.0 - Float64(5.0 * (v ^ 2.0))) / fma(v, v, -1.0)))) t_1 = Float64(-t_0) return Float64(fma(pi, 0.5, Float64(t_0 * Float64(t_0 * t_1))) + fma(t_1, Float64(t_0 * cbrt(asin(Float64(-1.0 + Float64((v ^ 2.0) * Float64(4.0 + Float64((v ^ 2.0) * Float64(4.0 + Float64((v ^ 2.0) * 4.0))))))))), Float64(t_0 * ((cbrt(cbrt(asin(Float64(Float64(1.0 + Float64((v ^ 2.0) * -5.0)) / fma(v, v, -1.0))))) ^ 2.0) ^ 3.0)))) end
code[v_] := Block[{t$95$0 = N[Power[N[ArcSin[N[(N[(1.0 - N[(5.0 * N[Power[v, 2.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(v * v + -1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision], 1/3], $MachinePrecision]}, Block[{t$95$1 = (-t$95$0)}, N[(N[(Pi * 0.5 + N[(t$95$0 * N[(t$95$0 * t$95$1), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(t$95$1 * N[(t$95$0 * N[Power[N[ArcSin[N[(-1.0 + N[(N[Power[v, 2.0], $MachinePrecision] * N[(4.0 + N[(N[Power[v, 2.0], $MachinePrecision] * N[(4.0 + N[(N[Power[v, 2.0], $MachinePrecision] * 4.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision], 1/3], $MachinePrecision]), $MachinePrecision] + N[(t$95$0 * N[Power[N[Power[N[Power[N[Power[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], 1/3], $MachinePrecision], 1/3], $MachinePrecision], 2.0], $MachinePrecision], 3.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \sqrt[3]{\sin^{-1} \left(\frac{1 - 5 \cdot {v}^{2}}{\mathsf{fma}\left(v, v, -1\right)}\right)}\\
t_1 := -t\_0\\
\mathsf{fma}\left(\pi, 0.5, t\_0 \cdot \left(t\_0 \cdot t\_1\right)\right) + \mathsf{fma}\left(t\_1, t\_0 \cdot \sqrt[3]{\sin^{-1} \left(-1 + {v}^{2} \cdot \left(4 + {v}^{2} \cdot \left(4 + {v}^{2} \cdot 4\right)\right)\right)}, t\_0 \cdot {\left({\left(\sqrt[3]{\sqrt[3]{\sin^{-1} \left(\frac{1 + {v}^{2} \cdot -5}{\mathsf{fma}\left(v, v, -1\right)}\right)}}\right)}^{2}\right)}^{3}\right)
\end{array}
\end{array}
Initial program 98.9%
acos-asin98.9%
div-inv98.9%
metadata-eval98.9%
add-cube-cbrt96.6%
prod-diff96.6%
Applied egg-rr96.6%
Taylor expanded in v around 0 96.6%
add-cube-cbrt97.4%
pow396.6%
cbrt-prod98.9%
Applied egg-rr98.9%
Final simplification98.9%
(FPCore (v)
:precision binary64
(let* ((t_0 (asin (/ (+ 1.0 (* (pow v 2.0) -5.0)) (fma v v -1.0))))
(t_1 (cbrt (asin (/ (- 1.0 (* 5.0 (pow v 2.0))) (fma v v -1.0))))))
(+
(fma PI 0.5 (* t_1 (- (cbrt (pow t_0 2.0)))))
(fma
(- t_1)
(*
t_1
(cbrt
(asin
(+
-1.0
(*
(pow v 2.0)
(+ 4.0 (* (pow v 2.0) (+ 4.0 (* (pow v 2.0) 4.0)))))))))
(* t_1 (pow (cbrt t_0) 2.0))))))
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(asin(((1.0 - (5.0 * pow(v, 2.0))) / fma(v, v, -1.0))));
return fma(((double) M_PI), 0.5, (t_1 * -cbrt(pow(t_0, 2.0)))) + fma(-t_1, (t_1 * cbrt(asin((-1.0 + (pow(v, 2.0) * (4.0 + (pow(v, 2.0) * (4.0 + (pow(v, 2.0) * 4.0))))))))), (t_1 * pow(cbrt(t_0), 2.0)));
}
function code(v) t_0 = asin(Float64(Float64(1.0 + Float64((v ^ 2.0) * -5.0)) / fma(v, v, -1.0))) t_1 = cbrt(asin(Float64(Float64(1.0 - Float64(5.0 * (v ^ 2.0))) / fma(v, v, -1.0)))) return Float64(fma(pi, 0.5, Float64(t_1 * Float64(-cbrt((t_0 ^ 2.0))))) + fma(Float64(-t_1), Float64(t_1 * cbrt(asin(Float64(-1.0 + Float64((v ^ 2.0) * Float64(4.0 + Float64((v ^ 2.0) * Float64(4.0 + Float64((v ^ 2.0) * 4.0))))))))), Float64(t_1 * (cbrt(t_0) ^ 2.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]}, Block[{t$95$1 = N[Power[N[ArcSin[N[(N[(1.0 - N[(5.0 * N[Power[v, 2.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(v * v + -1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision], 1/3], $MachinePrecision]}, N[(N[(Pi * 0.5 + N[(t$95$1 * (-N[Power[N[Power[t$95$0, 2.0], $MachinePrecision], 1/3], $MachinePrecision])), $MachinePrecision]), $MachinePrecision] + N[((-t$95$1) * N[(t$95$1 * N[Power[N[ArcSin[N[(-1.0 + N[(N[Power[v, 2.0], $MachinePrecision] * N[(4.0 + N[(N[Power[v, 2.0], $MachinePrecision] * N[(4.0 + N[(N[Power[v, 2.0], $MachinePrecision] * 4.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision], 1/3], $MachinePrecision]), $MachinePrecision] + N[(t$95$1 * N[Power[N[Power[t$95$0, 1/3], $MachinePrecision], 2.0], $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]{\sin^{-1} \left(\frac{1 - 5 \cdot {v}^{2}}{\mathsf{fma}\left(v, v, -1\right)}\right)}\\
\mathsf{fma}\left(\pi, 0.5, t\_1 \cdot \left(-\sqrt[3]{{t\_0}^{2}}\right)\right) + \mathsf{fma}\left(-t\_1, t\_1 \cdot \sqrt[3]{\sin^{-1} \left(-1 + {v}^{2} \cdot \left(4 + {v}^{2} \cdot \left(4 + {v}^{2} \cdot 4\right)\right)\right)}, t\_1 \cdot {\left(\sqrt[3]{t\_0}\right)}^{2}\right)
\end{array}
\end{array}
Initial program 98.9%
acos-asin98.9%
div-inv98.9%
metadata-eval98.9%
add-cube-cbrt96.6%
prod-diff96.6%
Applied egg-rr96.6%
Taylor expanded in v around 0 96.6%
cbrt-unprod98.9%
rem-3cbrt-rft98.9%
rem-3cbrt-rft97.4%
pow297.4%
Applied egg-rr98.9%
sqr-neg98.9%
pow298.9%
Applied egg-rr98.9%
Final simplification98.9%
(FPCore (v)
:precision binary64
(let* ((t_0 (- 1.0 (* 5.0 (pow v 2.0))))
(t_1 (asin (/ t_0 (+ (pow v 2.0) -1.0)))))
(+
(fma
PI
0.5
(*
(cbrt (asin (/ t_0 (fma v v -1.0))))
(-
(cbrt
(pow (asin (/ (+ 1.0 (* (pow v 2.0) -5.0)) (fma v v -1.0))) 2.0)))))
(-
t_1
(cbrt
(*
(asin
(+
-1.0
(+ (* (pow v 2.0) 4.0) (+ (* 4.0 (pow v 4.0)) (* 4.0 (pow v 6.0))))))
(pow t_1 2.0)))))))
double code(double v) {
double t_0 = 1.0 - (5.0 * pow(v, 2.0));
double t_1 = asin((t_0 / (pow(v, 2.0) + -1.0)));
return fma(((double) M_PI), 0.5, (cbrt(asin((t_0 / fma(v, v, -1.0)))) * -cbrt(pow(asin(((1.0 + (pow(v, 2.0) * -5.0)) / fma(v, v, -1.0))), 2.0)))) + (t_1 - cbrt((asin((-1.0 + ((pow(v, 2.0) * 4.0) + ((4.0 * pow(v, 4.0)) + (4.0 * pow(v, 6.0)))))) * pow(t_1, 2.0))));
}
function code(v) t_0 = Float64(1.0 - Float64(5.0 * (v ^ 2.0))) t_1 = asin(Float64(t_0 / Float64((v ^ 2.0) + -1.0))) return Float64(fma(pi, 0.5, Float64(cbrt(asin(Float64(t_0 / fma(v, v, -1.0)))) * Float64(-cbrt((asin(Float64(Float64(1.0 + Float64((v ^ 2.0) * -5.0)) / fma(v, v, -1.0))) ^ 2.0))))) + Float64(t_1 - cbrt(Float64(asin(Float64(-1.0 + Float64(Float64((v ^ 2.0) * 4.0) + Float64(Float64(4.0 * (v ^ 4.0)) + Float64(4.0 * (v ^ 6.0)))))) * (t_1 ^ 2.0))))) end
code[v_] := Block[{t$95$0 = N[(1.0 - N[(5.0 * N[Power[v, 2.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$1 = N[ArcSin[N[(t$95$0 / N[(N[Power[v, 2.0], $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]}, N[(N[(Pi * 0.5 + N[(N[Power[N[ArcSin[N[(t$95$0 / N[(v * v + -1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision], 1/3], $MachinePrecision] * (-N[Power[N[Power[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], 2.0], $MachinePrecision], 1/3], $MachinePrecision])), $MachinePrecision]), $MachinePrecision] + N[(t$95$1 - N[Power[N[(N[ArcSin[N[(-1.0 + N[(N[(N[Power[v, 2.0], $MachinePrecision] * 4.0), $MachinePrecision] + N[(N[(4.0 * N[Power[v, 4.0], $MachinePrecision]), $MachinePrecision] + N[(4.0 * N[Power[v, 6.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * N[Power[t$95$1, 2.0], $MachinePrecision]), $MachinePrecision], 1/3], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := 1 - 5 \cdot {v}^{2}\\
t_1 := \sin^{-1} \left(\frac{t\_0}{{v}^{2} + -1}\right)\\
\mathsf{fma}\left(\pi, 0.5, \sqrt[3]{\sin^{-1} \left(\frac{t\_0}{\mathsf{fma}\left(v, v, -1\right)}\right)} \cdot \left(-\sqrt[3]{{\sin^{-1} \left(\frac{1 + {v}^{2} \cdot -5}{\mathsf{fma}\left(v, v, -1\right)}\right)}^{2}}\right)\right) + \left(t\_1 - \sqrt[3]{\sin^{-1} \left(-1 + \left({v}^{2} \cdot 4 + \left(4 \cdot {v}^{4} + 4 \cdot {v}^{6}\right)\right)\right) \cdot {t\_1}^{2}}\right)
\end{array}
\end{array}
Initial program 98.9%
acos-asin98.9%
div-inv98.9%
metadata-eval98.9%
add-cube-cbrt96.6%
prod-diff96.6%
Applied egg-rr96.6%
Taylor expanded in v around 0 96.6%
cbrt-unprod98.9%
rem-3cbrt-rft98.9%
rem-3cbrt-rft97.4%
pow297.4%
Applied egg-rr98.9%
Taylor expanded in v around inf 98.9%
Final simplification98.9%
(FPCore (v) :precision binary64 (exp (* (log (cbrt (cbrt (acos (/ (fma (pow v 2.0) -5.0 1.0) (fma v v -1.0)))))) 9.0)))
double code(double v) {
return exp((log(cbrt(cbrt(acos((fma(pow(v, 2.0), -5.0, 1.0) / fma(v, v, -1.0)))))) * 9.0));
}
function code(v) return exp(Float64(log(cbrt(cbrt(acos(Float64(fma((v ^ 2.0), -5.0, 1.0) / fma(v, v, -1.0)))))) * 9.0)) end
code[v_] := N[Exp[N[(N[Log[N[Power[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], 1/3], $MachinePrecision]], $MachinePrecision] * 9.0), $MachinePrecision]], $MachinePrecision]
\begin{array}{l}
\\
e^{\log \left(\sqrt[3]{\sqrt[3]{\cos^{-1} \left(\frac{\mathsf{fma}\left({v}^{2}, -5, 1\right)}{\mathsf{fma}\left(v, v, -1\right)}\right)}}\right) \cdot 9}
\end{array}
Initial program 98.9%
add-cube-cbrt96.6%
pow397.4%
pow297.4%
fma-neg97.4%
metadata-eval97.4%
Applied egg-rr97.4%
add-cube-cbrt96.6%
pow396.6%
sub-neg96.6%
*-commutative96.6%
distribute-rgt-neg-in96.6%
metadata-eval96.6%
Applied egg-rr96.6%
pow-pow97.4%
pow-to-exp98.9%
+-commutative98.9%
fma-define98.9%
metadata-eval98.9%
Applied egg-rr98.9%
Final simplification98.9%
(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 98.9%
Final simplification98.9%
(FPCore (v) :precision binary64 (acos (+ -1.0 (* 4.0 (* v v)))))
double code(double v) {
return acos((-1.0 + (4.0 * (v * v))));
}
real(8) function code(v)
real(8), intent (in) :: v
code = acos(((-1.0d0) + (4.0d0 * (v * v))))
end function
public static double code(double v) {
return Math.acos((-1.0 + (4.0 * (v * v))));
}
def code(v): return math.acos((-1.0 + (4.0 * (v * v))))
function code(v) return acos(Float64(-1.0 + Float64(4.0 * Float64(v * v)))) end
function tmp = code(v) tmp = acos((-1.0 + (4.0 * (v * v)))); end
code[v_] := N[ArcCos[N[(-1.0 + N[(4.0 * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\begin{array}{l}
\\
\cos^{-1} \left(-1 + 4 \cdot \left(v \cdot v\right)\right)
\end{array}
Initial program 98.9%
Taylor expanded in v around 0 98.5%
unpow298.5%
Applied egg-rr98.5%
Final simplification98.5%
(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.7%
Final simplification97.7%
herbie shell --seed 2024082
(FPCore (v)
:name "Falkner and Boettcher, Appendix B, 1"
:precision binary64
(acos (/ (- 1.0 (* 5.0 (* v v))) (- (* v v) 1.0))))