
(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 8 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 (* (* v v) -5.0)) (t_1 (+ -1.0 (* v v))))
(sqrt
(*
(acos (/ (+ (* 25.0 (pow v 4.0)) -1.0) (* t_1 (+ -1.0 t_0))))
(acos (/ (+ t_0 1.0) t_1))))))
double code(double v) {
double t_0 = (v * v) * -5.0;
double t_1 = -1.0 + (v * v);
return sqrt((acos((((25.0 * pow(v, 4.0)) + -1.0) / (t_1 * (-1.0 + t_0)))) * acos(((t_0 + 1.0) / t_1))));
}
real(8) function code(v)
real(8), intent (in) :: v
real(8) :: t_0
real(8) :: t_1
t_0 = (v * v) * (-5.0d0)
t_1 = (-1.0d0) + (v * v)
code = sqrt((acos((((25.0d0 * (v ** 4.0d0)) + (-1.0d0)) / (t_1 * ((-1.0d0) + t_0)))) * acos(((t_0 + 1.0d0) / t_1))))
end function
public static double code(double v) {
double t_0 = (v * v) * -5.0;
double t_1 = -1.0 + (v * v);
return Math.sqrt((Math.acos((((25.0 * Math.pow(v, 4.0)) + -1.0) / (t_1 * (-1.0 + t_0)))) * Math.acos(((t_0 + 1.0) / t_1))));
}
def code(v): t_0 = (v * v) * -5.0 t_1 = -1.0 + (v * v) return math.sqrt((math.acos((((25.0 * math.pow(v, 4.0)) + -1.0) / (t_1 * (-1.0 + t_0)))) * math.acos(((t_0 + 1.0) / t_1))))
function code(v) t_0 = Float64(Float64(v * v) * -5.0) t_1 = Float64(-1.0 + Float64(v * v)) return sqrt(Float64(acos(Float64(Float64(Float64(25.0 * (v ^ 4.0)) + -1.0) / Float64(t_1 * Float64(-1.0 + t_0)))) * acos(Float64(Float64(t_0 + 1.0) / t_1)))) end
function tmp = code(v) t_0 = (v * v) * -5.0; t_1 = -1.0 + (v * v); tmp = sqrt((acos((((25.0 * (v ^ 4.0)) + -1.0) / (t_1 * (-1.0 + t_0)))) * acos(((t_0 + 1.0) / t_1)))); end
code[v_] := Block[{t$95$0 = N[(N[(v * v), $MachinePrecision] * -5.0), $MachinePrecision]}, Block[{t$95$1 = N[(-1.0 + N[(v * v), $MachinePrecision]), $MachinePrecision]}, N[Sqrt[N[(N[ArcCos[N[(N[(N[(25.0 * N[Power[v, 4.0], $MachinePrecision]), $MachinePrecision] + -1.0), $MachinePrecision] / N[(t$95$1 * N[(-1.0 + t$95$0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * N[ArcCos[N[(N[(t$95$0 + 1.0), $MachinePrecision] / t$95$1), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(v \cdot v\right) \cdot -5\\
t_1 := -1 + v \cdot v\\
\sqrt{\cos^{-1} \left(\frac{25 \cdot {v}^{4} + -1}{t\_1 \cdot \left(-1 + t\_0\right)}\right) \cdot \cos^{-1} \left(\frac{t\_0 + 1}{t\_1}\right)}
\end{array}
\end{array}
Initial program 98.7%
Applied egg-rr98.7%
inv-powN/A
metadata-evalN/A
metadata-evalN/A
metadata-evalN/A
metadata-evalN/A
metadata-evalN/A
Applied egg-rr98.7%
+-commutativeN/A
flip-+N/A
/-lowering-/.f64N/A
metadata-evalN/A
--lowering--.f64N/A
swap-sqrN/A
*-lowering-*.f64N/A
associate-*l*N/A
*-lowering-*.f64N/A
*-lowering-*.f64N/A
*-lowering-*.f64N/A
metadata-evalN/A
--lowering--.f64N/A
*-lowering-*.f64N/A
*-lowering-*.f6498.7%
Applied egg-rr98.7%
Taylor expanded in v around 0
Simplified98.8%
Final simplification98.8%
(FPCore (v) :precision binary64 (pow (/ 1.0 (pow (/ 1.0 (acos (/ (+ 1.0 (* v (* v -5.0))) (+ -1.0 (* v v))))) -2.0)) -0.5))
double code(double v) {
return pow((1.0 / pow((1.0 / acos(((1.0 + (v * (v * -5.0))) / (-1.0 + (v * v))))), -2.0)), -0.5);
}
real(8) function code(v)
real(8), intent (in) :: v
code = (1.0d0 / ((1.0d0 / acos(((1.0d0 + (v * (v * (-5.0d0)))) / ((-1.0d0) + (v * v))))) ** (-2.0d0))) ** (-0.5d0)
end function
public static double code(double v) {
return Math.pow((1.0 / Math.pow((1.0 / Math.acos(((1.0 + (v * (v * -5.0))) / (-1.0 + (v * v))))), -2.0)), -0.5);
}
def code(v): return math.pow((1.0 / math.pow((1.0 / math.acos(((1.0 + (v * (v * -5.0))) / (-1.0 + (v * v))))), -2.0)), -0.5)
function code(v) return Float64(1.0 / (Float64(1.0 / acos(Float64(Float64(1.0 + Float64(v * Float64(v * -5.0))) / Float64(-1.0 + Float64(v * v))))) ^ -2.0)) ^ -0.5 end
function tmp = code(v) tmp = (1.0 / ((1.0 / acos(((1.0 + (v * (v * -5.0))) / (-1.0 + (v * v))))) ^ -2.0)) ^ -0.5; end
code[v_] := N[Power[N[(1.0 / N[Power[N[(1.0 / N[ArcCos[N[(N[(1.0 + N[(v * N[(v * -5.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(-1.0 + N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], -2.0], $MachinePrecision]), $MachinePrecision], -0.5], $MachinePrecision]
\begin{array}{l}
\\
{\left(\frac{1}{{\left(\frac{1}{\cos^{-1} \left(\frac{1 + v \cdot \left(v \cdot -5\right)}{-1 + v \cdot v}\right)}\right)}^{-2}}\right)}^{-0.5}
\end{array}
Initial program 98.7%
Applied egg-rr98.7%
inv-powN/A
metadata-evalN/A
metadata-evalN/A
metadata-evalN/A
metadata-evalN/A
metadata-evalN/A
Applied egg-rr98.7%
un-div-invN/A
clear-numN/A
/-lowering-/.f64N/A
/-lowering-/.f64N/A
Applied egg-rr98.7%
/-rgt-identityN/A
clear-numN/A
associate-/r/N/A
pow2N/A
pow-flipN/A
pow-lowering-pow.f64N/A
Applied egg-rr98.7%
Final simplification98.7%
(FPCore (v) :precision binary64 (/ 1.0 (pow (pow (acos (/ (+ (* (* v v) -5.0) 1.0) (+ -1.0 (* v v)))) -2.0) 0.5)))
double code(double v) {
return 1.0 / pow(pow(acos(((((v * v) * -5.0) + 1.0) / (-1.0 + (v * v)))), -2.0), 0.5);
}
real(8) function code(v)
real(8), intent (in) :: v
code = 1.0d0 / ((acos(((((v * v) * (-5.0d0)) + 1.0d0) / ((-1.0d0) + (v * v)))) ** (-2.0d0)) ** 0.5d0)
end function
public static double code(double v) {
return 1.0 / Math.pow(Math.pow(Math.acos(((((v * v) * -5.0) + 1.0) / (-1.0 + (v * v)))), -2.0), 0.5);
}
def code(v): return 1.0 / math.pow(math.pow(math.acos(((((v * v) * -5.0) + 1.0) / (-1.0 + (v * v)))), -2.0), 0.5)
function code(v) return Float64(1.0 / ((acos(Float64(Float64(Float64(Float64(v * v) * -5.0) + 1.0) / Float64(-1.0 + Float64(v * v)))) ^ -2.0) ^ 0.5)) end
function tmp = code(v) tmp = 1.0 / ((acos(((((v * v) * -5.0) + 1.0) / (-1.0 + (v * v)))) ^ -2.0) ^ 0.5); end
code[v_] := N[(1.0 / N[Power[N[Power[N[ArcCos[N[(N[(N[(N[(v * v), $MachinePrecision] * -5.0), $MachinePrecision] + 1.0), $MachinePrecision] / N[(-1.0 + N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision], -2.0], $MachinePrecision], 0.5], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{1}{{\left({\cos^{-1} \left(\frac{\left(v \cdot v\right) \cdot -5 + 1}{-1 + v \cdot v}\right)}^{-2}\right)}^{0.5}}
\end{array}
Initial program 98.7%
Applied egg-rr98.7%
rem-cube-cbrtN/A
cbrt-unprodN/A
pow2N/A
pow-powN/A
pow-lowering-pow.f64N/A
cbrt-lowering-cbrt.f64N/A
PI-lowering-PI.f64N/A
metadata-eval96.4%
Applied egg-rr96.4%
Applied egg-rr98.7%
Final simplification98.7%
(FPCore (v) :precision binary64 (/ 1.0 (/ 1.0 (acos (/ (+ (* (* v v) -5.0) 1.0) (+ -1.0 (* v v)))))))
double code(double v) {
return 1.0 / (1.0 / acos(((((v * v) * -5.0) + 1.0) / (-1.0 + (v * v)))));
}
real(8) function code(v)
real(8), intent (in) :: v
code = 1.0d0 / (1.0d0 / acos(((((v * v) * (-5.0d0)) + 1.0d0) / ((-1.0d0) + (v * v)))))
end function
public static double code(double v) {
return 1.0 / (1.0 / Math.acos(((((v * v) * -5.0) + 1.0) / (-1.0 + (v * v)))));
}
def code(v): return 1.0 / (1.0 / math.acos(((((v * v) * -5.0) + 1.0) / (-1.0 + (v * v)))))
function code(v) return Float64(1.0 / Float64(1.0 / acos(Float64(Float64(Float64(Float64(v * v) * -5.0) + 1.0) / Float64(-1.0 + Float64(v * v)))))) end
function tmp = code(v) tmp = 1.0 / (1.0 / acos(((((v * v) * -5.0) + 1.0) / (-1.0 + (v * v))))); end
code[v_] := N[(1.0 / N[(1.0 / N[ArcCos[N[(N[(N[(N[(v * v), $MachinePrecision] * -5.0), $MachinePrecision] + 1.0), $MachinePrecision] / N[(-1.0 + N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{1}{\frac{1}{\cos^{-1} \left(\frac{\left(v \cdot v\right) \cdot -5 + 1}{-1 + v \cdot v}\right)}}
\end{array}
Initial program 98.7%
Applied egg-rr98.7%
/-lowering-/.f64N/A
clear-numN/A
Applied egg-rr98.7%
Final simplification98.7%
(FPCore (v) :precision binary64 (acos (/ (- 1.0 (* (* v v) 5.0)) (+ -1.0 (* v v)))))
double code(double v) {
return acos(((1.0 - ((v * v) * 5.0)) / (-1.0 + (v * v))));
}
real(8) function code(v)
real(8), intent (in) :: v
code = acos(((1.0d0 - ((v * v) * 5.0d0)) / ((-1.0d0) + (v * v))))
end function
public static double code(double v) {
return Math.acos(((1.0 - ((v * v) * 5.0)) / (-1.0 + (v * v))));
}
def code(v): return math.acos(((1.0 - ((v * v) * 5.0)) / (-1.0 + (v * v))))
function code(v) return acos(Float64(Float64(1.0 - Float64(Float64(v * v) * 5.0)) / Float64(-1.0 + Float64(v * v)))) end
function tmp = code(v) tmp = acos(((1.0 - ((v * v) * 5.0)) / (-1.0 + (v * v)))); end
code[v_] := N[ArcCos[N[(N[(1.0 - N[(N[(v * v), $MachinePrecision] * 5.0), $MachinePrecision]), $MachinePrecision] / N[(-1.0 + N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\begin{array}{l}
\\
\cos^{-1} \left(\frac{1 - \left(v \cdot v\right) \cdot 5}{-1 + v \cdot v}\right)
\end{array}
Initial program 98.7%
Final simplification98.7%
(FPCore (v) :precision binary64 (/ 1.0 (/ 1.0 (acos (+ -1.0 (* 4.0 (* v v)))))))
double code(double v) {
return 1.0 / (1.0 / acos((-1.0 + (4.0 * (v * v)))));
}
real(8) function code(v)
real(8), intent (in) :: v
code = 1.0d0 / (1.0d0 / acos(((-1.0d0) + (4.0d0 * (v * v)))))
end function
public static double code(double v) {
return 1.0 / (1.0 / Math.acos((-1.0 + (4.0 * (v * v)))));
}
def code(v): return 1.0 / (1.0 / math.acos((-1.0 + (4.0 * (v * v)))))
function code(v) return Float64(1.0 / Float64(1.0 / acos(Float64(-1.0 + Float64(4.0 * Float64(v * v)))))) end
function tmp = code(v) tmp = 1.0 / (1.0 / acos((-1.0 + (4.0 * (v * v))))); end
code[v_] := N[(1.0 / N[(1.0 / N[ArcCos[N[(-1.0 + N[(4.0 * N[(v * v), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{1}{\frac{1}{\cos^{-1} \left(-1 + 4 \cdot \left(v \cdot v\right)\right)}}
\end{array}
Initial program 98.7%
Taylor expanded in v around 0
sub-negN/A
metadata-evalN/A
+-commutativeN/A
+-lowering-+.f64N/A
*-commutativeN/A
*-lowering-*.f64N/A
unpow2N/A
*-lowering-*.f6497.4%
Simplified97.4%
acos-asinN/A
--lowering--.f64N/A
/-lowering-/.f64N/A
PI-lowering-PI.f64N/A
asin-lowering-asin.f64N/A
+-lowering-+.f64N/A
associate-*l*N/A
*-lowering-*.f64N/A
*-lowering-*.f6497.4%
Applied egg-rr97.4%
flip--N/A
clear-numN/A
frac-timesN/A
metadata-evalN/A
unpow2N/A
/-lowering-/.f64N/A
Applied egg-rr97.4%
Final simplification97.4%
(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.7%
Taylor expanded in v around 0
sub-negN/A
metadata-evalN/A
+-commutativeN/A
+-lowering-+.f64N/A
*-commutativeN/A
*-lowering-*.f64N/A
unpow2N/A
*-lowering-*.f6497.4%
Simplified97.4%
Final simplification97.4%
(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.7%
Taylor expanded in v around 0
Simplified96.3%
herbie shell --seed 2024161
(FPCore (v)
:name "Falkner and Boettcher, Appendix B, 1"
:precision binary64
(acos (/ (- 1.0 (* 5.0 (* v v))) (- (* v v) 1.0))))