
(FPCore (x) :precision binary64 (- (/ PI 2.0) (* 2.0 (asin (sqrt (/ (- 1.0 x) 2.0))))))
double code(double x) {
return (((double) M_PI) / 2.0) - (2.0 * asin(sqrt(((1.0 - x) / 2.0))));
}
public static double code(double x) {
return (Math.PI / 2.0) - (2.0 * Math.asin(Math.sqrt(((1.0 - x) / 2.0))));
}
def code(x): return (math.pi / 2.0) - (2.0 * math.asin(math.sqrt(((1.0 - x) / 2.0))))
function code(x) return Float64(Float64(pi / 2.0) - Float64(2.0 * asin(sqrt(Float64(Float64(1.0 - x) / 2.0))))) end
function tmp = code(x) tmp = (pi / 2.0) - (2.0 * asin(sqrt(((1.0 - x) / 2.0)))); end
code[x_] := N[(N[(Pi / 2.0), $MachinePrecision] - N[(2.0 * N[ArcSin[N[Sqrt[N[(N[(1.0 - x), $MachinePrecision] / 2.0), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\pi}{2} - 2 \cdot \sin^{-1} \left(\sqrt{\frac{1 - x}{2}}\right)
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 2 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x) :precision binary64 (- (/ PI 2.0) (* 2.0 (asin (sqrt (/ (- 1.0 x) 2.0))))))
double code(double x) {
return (((double) M_PI) / 2.0) - (2.0 * asin(sqrt(((1.0 - x) / 2.0))));
}
public static double code(double x) {
return (Math.PI / 2.0) - (2.0 * Math.asin(Math.sqrt(((1.0 - x) / 2.0))));
}
def code(x): return (math.pi / 2.0) - (2.0 * math.asin(math.sqrt(((1.0 - x) / 2.0))))
function code(x) return Float64(Float64(pi / 2.0) - Float64(2.0 * asin(sqrt(Float64(Float64(1.0 - x) / 2.0))))) end
function tmp = code(x) tmp = (pi / 2.0) - (2.0 * asin(sqrt(((1.0 - x) / 2.0)))); end
code[x_] := N[(N[(Pi / 2.0), $MachinePrecision] - N[(2.0 * N[ArcSin[N[Sqrt[N[(N[(1.0 - x), $MachinePrecision] / 2.0), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\pi}{2} - 2 \cdot \sin^{-1} \left(\sqrt{\frac{1 - x}{2}}\right)
\end{array}
(FPCore (x) :precision binary64 (- (/ PI -2.0) (* -2.0 (acos (sqrt (+ 0.5 (/ x -2.0)))))))
double code(double x) {
return (((double) M_PI) / -2.0) - (-2.0 * acos(sqrt((0.5 + (x / -2.0)))));
}
public static double code(double x) {
return (Math.PI / -2.0) - (-2.0 * Math.acos(Math.sqrt((0.5 + (x / -2.0)))));
}
def code(x): return (math.pi / -2.0) - (-2.0 * math.acos(math.sqrt((0.5 + (x / -2.0)))))
function code(x) return Float64(Float64(pi / -2.0) - Float64(-2.0 * acos(sqrt(Float64(0.5 + Float64(x / -2.0)))))) end
function tmp = code(x) tmp = (pi / -2.0) - (-2.0 * acos(sqrt((0.5 + (x / -2.0))))); end
code[x_] := N[(N[(Pi / -2.0), $MachinePrecision] - N[(-2.0 * N[ArcCos[N[Sqrt[N[(0.5 + N[(x / -2.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\pi}{-2} - -2 \cdot \cos^{-1} \left(\sqrt{0.5 + \frac{x}{-2}}\right)
\end{array}
Initial program 5.9%
asin-acosN/A
--lowering--.f64N/A
/-lowering-/.f64N/A
PI-lowering-PI.f64N/A
acos-lowering-acos.f64N/A
clear-numN/A
inv-powN/A
sqrt-pow1N/A
metadata-evalN/A
metadata-evalN/A
metadata-evalN/A
pow-lowering-pow.f64N/A
/-lowering-/.f64N/A
--lowering--.f64N/A
metadata-evalN/A
metadata-eval7.6%
Applied egg-rr7.6%
sub-negN/A
distribute-rgt-inN/A
fma-defineN/A
distribute-lft-neg-outN/A
fmm-undefN/A
div-invN/A
metadata-evalN/A
associate-*l*N/A
metadata-evalN/A
*-rgt-identityN/A
--lowering--.f64N/A
PI-lowering-PI.f64N/A
*-lowering-*.f64N/A
Applied egg-rr7.6%
sub-negN/A
associate--r+N/A
--lowering--.f64N/A
div-invN/A
metadata-evalN/A
*-rgt-identityN/A
distribute-lft-out--N/A
metadata-evalN/A
metadata-evalN/A
div-invN/A
/-lowering-/.f64N/A
PI-lowering-PI.f64N/A
distribute-rgt-neg-inN/A
metadata-evalN/A
*-lowering-*.f64N/A
Applied egg-rr7.6%
*-lowering-*.f64N/A
unpow1/2N/A
metadata-evalN/A
distribute-neg-frac2N/A
sub-negN/A
metadata-evalN/A
div-subN/A
acos-lowering-acos.f64N/A
sqrt-lowering-sqrt.f64N/A
div-subN/A
metadata-evalN/A
sub-negN/A
distribute-neg-frac2N/A
metadata-evalN/A
+-lowering-+.f64N/A
/-lowering-/.f647.6%
Applied egg-rr7.6%
Final simplification7.6%
(FPCore (x) :precision binary64 (- (/ PI -2.0) (* -2.0 (acos (sqrt 0.5)))))
double code(double x) {
return (((double) M_PI) / -2.0) - (-2.0 * acos(sqrt(0.5)));
}
public static double code(double x) {
return (Math.PI / -2.0) - (-2.0 * Math.acos(Math.sqrt(0.5)));
}
def code(x): return (math.pi / -2.0) - (-2.0 * math.acos(math.sqrt(0.5)))
function code(x) return Float64(Float64(pi / -2.0) - Float64(-2.0 * acos(sqrt(0.5)))) end
function tmp = code(x) tmp = (pi / -2.0) - (-2.0 * acos(sqrt(0.5))); end
code[x_] := N[(N[(Pi / -2.0), $MachinePrecision] - N[(-2.0 * N[ArcCos[N[Sqrt[0.5], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\pi}{-2} - -2 \cdot \cos^{-1} \left(\sqrt{0.5}\right)
\end{array}
Initial program 5.9%
asin-acosN/A
--lowering--.f64N/A
/-lowering-/.f64N/A
PI-lowering-PI.f64N/A
acos-lowering-acos.f64N/A
clear-numN/A
inv-powN/A
sqrt-pow1N/A
metadata-evalN/A
metadata-evalN/A
metadata-evalN/A
pow-lowering-pow.f64N/A
/-lowering-/.f64N/A
--lowering--.f64N/A
metadata-evalN/A
metadata-eval7.6%
Applied egg-rr7.6%
sub-negN/A
distribute-rgt-inN/A
fma-defineN/A
distribute-lft-neg-outN/A
fmm-undefN/A
div-invN/A
metadata-evalN/A
associate-*l*N/A
metadata-evalN/A
*-rgt-identityN/A
--lowering--.f64N/A
PI-lowering-PI.f64N/A
*-lowering-*.f64N/A
Applied egg-rr7.6%
sub-negN/A
associate--r+N/A
--lowering--.f64N/A
div-invN/A
metadata-evalN/A
*-rgt-identityN/A
distribute-lft-out--N/A
metadata-evalN/A
metadata-evalN/A
div-invN/A
/-lowering-/.f64N/A
PI-lowering-PI.f64N/A
distribute-rgt-neg-inN/A
metadata-evalN/A
*-lowering-*.f64N/A
Applied egg-rr7.6%
Taylor expanded in x around 0
sqrt-lowering-sqrt.f645.4%
Simplified5.4%
Final simplification5.4%
(FPCore (x) :precision binary64 (asin x))
double code(double x) {
return asin(x);
}
real(8) function code(x)
real(8), intent (in) :: x
code = asin(x)
end function
public static double code(double x) {
return Math.asin(x);
}
def code(x): return math.asin(x)
function code(x) return asin(x) end
function tmp = code(x) tmp = asin(x); end
code[x_] := N[ArcSin[x], $MachinePrecision]
\begin{array}{l}
\\
\sin^{-1} x
\end{array}
herbie shell --seed 2024159
(FPCore (x)
:name "Ian Simplification"
:precision binary64
:alt
(! :herbie-platform default (asin x))
(- (/ PI 2.0) (* 2.0 (asin (sqrt (/ (- 1.0 x) 2.0))))))