
(FPCore (x) :precision binary64 (* 2.0 (atan (sqrt (/ (- 1.0 x) (+ 1.0 x))))))
double code(double x) {
return 2.0 * atan(sqrt(((1.0 - x) / (1.0 + x))));
}
real(8) function code(x)
real(8), intent (in) :: x
code = 2.0d0 * atan(sqrt(((1.0d0 - x) / (1.0d0 + x))))
end function
public static double code(double x) {
return 2.0 * Math.atan(Math.sqrt(((1.0 - x) / (1.0 + x))));
}
def code(x): return 2.0 * math.atan(math.sqrt(((1.0 - x) / (1.0 + x))))
function code(x) return Float64(2.0 * atan(sqrt(Float64(Float64(1.0 - x) / Float64(1.0 + x))))) end
function tmp = code(x) tmp = 2.0 * atan(sqrt(((1.0 - x) / (1.0 + x)))); end
code[x_] := N[(2.0 * N[ArcTan[N[Sqrt[N[(N[(1.0 - x), $MachinePrecision] / N[(1.0 + x), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
2 \cdot \tan^{-1} \left(\sqrt{\frac{1 - x}{1 + x}}\right)
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 6 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x) :precision binary64 (* 2.0 (atan (sqrt (/ (- 1.0 x) (+ 1.0 x))))))
double code(double x) {
return 2.0 * atan(sqrt(((1.0 - x) / (1.0 + x))));
}
real(8) function code(x)
real(8), intent (in) :: x
code = 2.0d0 * atan(sqrt(((1.0d0 - x) / (1.0d0 + x))))
end function
public static double code(double x) {
return 2.0 * Math.atan(Math.sqrt(((1.0 - x) / (1.0 + x))));
}
def code(x): return 2.0 * math.atan(math.sqrt(((1.0 - x) / (1.0 + x))))
function code(x) return Float64(2.0 * atan(sqrt(Float64(Float64(1.0 - x) / Float64(1.0 + x))))) end
function tmp = code(x) tmp = 2.0 * atan(sqrt(((1.0 - x) / (1.0 + x)))); end
code[x_] := N[(2.0 * N[ArcTan[N[Sqrt[N[(N[(1.0 - x), $MachinePrecision] / N[(1.0 + x), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
2 \cdot \tan^{-1} \left(\sqrt{\frac{1 - x}{1 + x}}\right)
\end{array}
(FPCore (x) :precision binary64 (* 2.0 (atan (sqrt (- (/ 1.0 (+ 1.0 x)) (/ x (+ 1.0 x)))))))
double code(double x) {
return 2.0 * atan(sqrt(((1.0 / (1.0 + x)) - (x / (1.0 + x)))));
}
real(8) function code(x)
real(8), intent (in) :: x
code = 2.0d0 * atan(sqrt(((1.0d0 / (1.0d0 + x)) - (x / (1.0d0 + x)))))
end function
public static double code(double x) {
return 2.0 * Math.atan(Math.sqrt(((1.0 / (1.0 + x)) - (x / (1.0 + x)))));
}
def code(x): return 2.0 * math.atan(math.sqrt(((1.0 / (1.0 + x)) - (x / (1.0 + x)))))
function code(x) return Float64(2.0 * atan(sqrt(Float64(Float64(1.0 / Float64(1.0 + x)) - Float64(x / Float64(1.0 + x)))))) end
function tmp = code(x) tmp = 2.0 * atan(sqrt(((1.0 / (1.0 + x)) - (x / (1.0 + x))))); end
code[x_] := N[(2.0 * N[ArcTan[N[Sqrt[N[(N[(1.0 / N[(1.0 + x), $MachinePrecision]), $MachinePrecision] - N[(x / N[(1.0 + x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
2 \cdot \tan^{-1} \left(\sqrt{\frac{1}{1 + x} - \frac{x}{1 + x}}\right)
\end{array}
Initial program 100.0%
div-sub100.0%
Applied egg-rr100.0%
Final simplification100.0%
(FPCore (x) :precision binary64 (* 2.0 (atan (sqrt (/ (- 1.0 x) (+ 1.0 x))))))
double code(double x) {
return 2.0 * atan(sqrt(((1.0 - x) / (1.0 + x))));
}
real(8) function code(x)
real(8), intent (in) :: x
code = 2.0d0 * atan(sqrt(((1.0d0 - x) / (1.0d0 + x))))
end function
public static double code(double x) {
return 2.0 * Math.atan(Math.sqrt(((1.0 - x) / (1.0 + x))));
}
def code(x): return 2.0 * math.atan(math.sqrt(((1.0 - x) / (1.0 + x))))
function code(x) return Float64(2.0 * atan(sqrt(Float64(Float64(1.0 - x) / Float64(1.0 + x))))) end
function tmp = code(x) tmp = 2.0 * atan(sqrt(((1.0 - x) / (1.0 + x)))); end
code[x_] := N[(2.0 * N[ArcTan[N[Sqrt[N[(N[(1.0 - x), $MachinePrecision] / N[(1.0 + x), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
2 \cdot \tan^{-1} \left(\sqrt{\frac{1 - x}{1 + x}}\right)
\end{array}
Initial program 100.0%
Final simplification100.0%
(FPCore (x) :precision binary64 (let* ((t_0 (* x (+ x -1.0)))) (* 2.0 (atan (/ (+ (* t_0 t_0) -1.0) (+ t_0 -1.0))))))
double code(double x) {
double t_0 = x * (x + -1.0);
return 2.0 * atan((((t_0 * t_0) + -1.0) / (t_0 + -1.0)));
}
real(8) function code(x)
real(8), intent (in) :: x
real(8) :: t_0
t_0 = x * (x + (-1.0d0))
code = 2.0d0 * atan((((t_0 * t_0) + (-1.0d0)) / (t_0 + (-1.0d0))))
end function
public static double code(double x) {
double t_0 = x * (x + -1.0);
return 2.0 * Math.atan((((t_0 * t_0) + -1.0) / (t_0 + -1.0)));
}
def code(x): t_0 = x * (x + -1.0) return 2.0 * math.atan((((t_0 * t_0) + -1.0) / (t_0 + -1.0)))
function code(x) t_0 = Float64(x * Float64(x + -1.0)) return Float64(2.0 * atan(Float64(Float64(Float64(t_0 * t_0) + -1.0) / Float64(t_0 + -1.0)))) end
function tmp = code(x) t_0 = x * (x + -1.0); tmp = 2.0 * atan((((t_0 * t_0) + -1.0) / (t_0 + -1.0))); end
code[x_] := Block[{t$95$0 = N[(x * N[(x + -1.0), $MachinePrecision]), $MachinePrecision]}, N[(2.0 * N[ArcTan[N[(N[(N[(t$95$0 * t$95$0), $MachinePrecision] + -1.0), $MachinePrecision] / N[(t$95$0 + -1.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := x \cdot \left(x + -1\right)\\
2 \cdot \tan^{-1} \left(\frac{t_0 \cdot t_0 + -1}{t_0 + -1}\right)
\end{array}
\end{array}
Initial program 100.0%
clear-num100.0%
sqrt-div100.0%
metadata-eval100.0%
Applied egg-rr100.0%
Taylor expanded in x around 0 98.7%
Taylor expanded in x around 0 98.7%
neg-mul-198.7%
associate-+r+98.7%
sub-neg98.7%
Simplified98.7%
sub-neg98.7%
associate-+l+98.7%
neg-mul-198.7%
unpow298.7%
distribute-rgt-in98.7%
+-commutative98.7%
distribute-rgt-in98.7%
unpow298.7%
metadata-eval98.7%
cancel-sign-sub-inv98.7%
unpow298.7%
+-commutative98.7%
unpow298.7%
cancel-sign-sub-inv98.7%
unpow298.7%
metadata-eval98.7%
distribute-rgt-in98.7%
flip-+98.7%
metadata-eval98.7%
Applied egg-rr98.7%
Final simplification98.7%
(FPCore (x) :precision binary64 (* 2.0 (atan (/ 1.0 (+ 1.0 x)))))
double code(double x) {
return 2.0 * atan((1.0 / (1.0 + x)));
}
real(8) function code(x)
real(8), intent (in) :: x
code = 2.0d0 * atan((1.0d0 / (1.0d0 + x)))
end function
public static double code(double x) {
return 2.0 * Math.atan((1.0 / (1.0 + x)));
}
def code(x): return 2.0 * math.atan((1.0 / (1.0 + x)))
function code(x) return Float64(2.0 * atan(Float64(1.0 / Float64(1.0 + x)))) end
function tmp = code(x) tmp = 2.0 * atan((1.0 / (1.0 + x))); end
code[x_] := N[(2.0 * N[ArcTan[N[(1.0 / N[(1.0 + x), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
2 \cdot \tan^{-1} \left(\frac{1}{1 + x}\right)
\end{array}
Initial program 100.0%
clear-num100.0%
sqrt-div100.0%
metadata-eval100.0%
Applied egg-rr100.0%
Taylor expanded in x around 0 98.7%
Final simplification98.7%
(FPCore (x) :precision binary64 (* 2.0 (atan (- 1.0 x))))
double code(double x) {
return 2.0 * atan((1.0 - x));
}
real(8) function code(x)
real(8), intent (in) :: x
code = 2.0d0 * atan((1.0d0 - x))
end function
public static double code(double x) {
return 2.0 * Math.atan((1.0 - x));
}
def code(x): return 2.0 * math.atan((1.0 - x))
function code(x) return Float64(2.0 * atan(Float64(1.0 - x))) end
function tmp = code(x) tmp = 2.0 * atan((1.0 - x)); end
code[x_] := N[(2.0 * N[ArcTan[N[(1.0 - x), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
2 \cdot \tan^{-1} \left(1 - x\right)
\end{array}
Initial program 100.0%
Taylor expanded in x around 0 98.7%
neg-mul-198.7%
sub-neg98.7%
Simplified98.7%
Final simplification98.7%
(FPCore (x) :precision binary64 (* 2.0 (atan 1.0)))
double code(double x) {
return 2.0 * atan(1.0);
}
real(8) function code(x)
real(8), intent (in) :: x
code = 2.0d0 * atan(1.0d0)
end function
public static double code(double x) {
return 2.0 * Math.atan(1.0);
}
def code(x): return 2.0 * math.atan(1.0)
function code(x) return Float64(2.0 * atan(1.0)) end
function tmp = code(x) tmp = 2.0 * atan(1.0); end
code[x_] := N[(2.0 * N[ArcTan[1.0], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
2 \cdot \tan^{-1} 1
\end{array}
Initial program 100.0%
Taylor expanded in x around 0 97.7%
Final simplification97.7%
herbie shell --seed 2023336
(FPCore (x)
:name "arccos"
:precision binary64
(* 2.0 (atan (sqrt (/ (- 1.0 x) (+ 1.0 x))))))