
(FPCore (g h) :precision binary64 (* 2.0 (cos (+ (/ (* 2.0 PI) 3.0) (/ (acos (/ (- g) h)) 3.0)))))
double code(double g, double h) {
return 2.0 * cos((((2.0 * ((double) M_PI)) / 3.0) + (acos((-g / h)) / 3.0)));
}
public static double code(double g, double h) {
return 2.0 * Math.cos((((2.0 * Math.PI) / 3.0) + (Math.acos((-g / h)) / 3.0)));
}
def code(g, h): return 2.0 * math.cos((((2.0 * math.pi) / 3.0) + (math.acos((-g / h)) / 3.0)))
function code(g, h) return Float64(2.0 * cos(Float64(Float64(Float64(2.0 * pi) / 3.0) + Float64(acos(Float64(Float64(-g) / h)) / 3.0)))) end
function tmp = code(g, h) tmp = 2.0 * cos((((2.0 * pi) / 3.0) + (acos((-g / h)) / 3.0))); end
code[g_, h_] := N[(2.0 * N[Cos[N[(N[(N[(2.0 * Pi), $MachinePrecision] / 3.0), $MachinePrecision] + N[(N[ArcCos[N[((-g) / h), $MachinePrecision]], $MachinePrecision] / 3.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
2 \cdot \cos \left(\frac{2 \cdot \pi}{3} + \frac{\cos^{-1} \left(\frac{-g}{h}\right)}{3}\right)
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 2 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (g h) :precision binary64 (* 2.0 (cos (+ (/ (* 2.0 PI) 3.0) (/ (acos (/ (- g) h)) 3.0)))))
double code(double g, double h) {
return 2.0 * cos((((2.0 * ((double) M_PI)) / 3.0) + (acos((-g / h)) / 3.0)));
}
public static double code(double g, double h) {
return 2.0 * Math.cos((((2.0 * Math.PI) / 3.0) + (Math.acos((-g / h)) / 3.0)));
}
def code(g, h): return 2.0 * math.cos((((2.0 * math.pi) / 3.0) + (math.acos((-g / h)) / 3.0)))
function code(g, h) return Float64(2.0 * cos(Float64(Float64(Float64(2.0 * pi) / 3.0) + Float64(acos(Float64(Float64(-g) / h)) / 3.0)))) end
function tmp = code(g, h) tmp = 2.0 * cos((((2.0 * pi) / 3.0) + (acos((-g / h)) / 3.0))); end
code[g_, h_] := N[(2.0 * N[Cos[N[(N[(N[(2.0 * Pi), $MachinePrecision] / 3.0), $MachinePrecision] + N[(N[ArcCos[N[((-g) / h), $MachinePrecision]], $MachinePrecision] / 3.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
2 \cdot \cos \left(\frac{2 \cdot \pi}{3} + \frac{\cos^{-1} \left(\frac{-g}{h}\right)}{3}\right)
\end{array}
(FPCore (g h)
:precision binary64
(*
2.0
(sin
(+
(/ (fma (* 2.0 (pow PI 0.5)) (pow PI 0.5) (acos (/ (* -1.0 g) h))) -3.0)
(* (pow PI 0.5) (/ (pow PI 0.5) 2.0))))))
double code(double g, double h) {
return 2.0 * sin(((fma((2.0 * pow(((double) M_PI), 0.5)), pow(((double) M_PI), 0.5), acos(((-1.0 * g) / h))) / -3.0) + (pow(((double) M_PI), 0.5) * (pow(((double) M_PI), 0.5) / 2.0))));
}
function code(g, h) return Float64(2.0 * sin(Float64(Float64(fma(Float64(2.0 * (pi ^ 0.5)), (pi ^ 0.5), acos(Float64(Float64(-1.0 * g) / h))) / -3.0) + Float64((pi ^ 0.5) * Float64((pi ^ 0.5) / 2.0))))) end
code[g_, h_] := N[(2.0 * N[Sin[N[(N[(N[(N[(2.0 * N[Power[Pi, 0.5], $MachinePrecision]), $MachinePrecision] * N[Power[Pi, 0.5], $MachinePrecision] + N[ArcCos[N[(N[(-1.0 * g), $MachinePrecision] / h), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] / -3.0), $MachinePrecision] + N[(N[Power[Pi, 0.5], $MachinePrecision] * N[(N[Power[Pi, 0.5], $MachinePrecision] / 2.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
2 \cdot \sin \left(\frac{\mathsf{fma}\left(2 \cdot {\pi}^{0.5}, {\pi}^{0.5}, \cos^{-1} \left(\frac{-1 \cdot g}{h}\right)\right)}{-3} + {\pi}^{0.5} \cdot \frac{{\pi}^{0.5}}{2}\right)
\end{array}
Initial program 98.5%
lift-cos.f64N/A
cos-neg-revN/A
sin-+PI/2-revN/A
lower-sin.f64N/A
lower-+.f64N/A
Applied rewrites98.5%
lift-PI.f64N/A
lift-/.f64N/A
add-sqr-sqrtN/A
unpow1/2N/A
lift-pow.f64N/A
lift-PI.f64N/A
unpow1/2N/A
lift-pow.f64N/A
lift-PI.f64N/A
associate-/l*N/A
lower-*.f64N/A
lower-/.f64100.0
Applied rewrites100.0%
(FPCore (g h) :precision binary64 (* 2.0 (cos (+ (/ (* 2.0 PI) 3.0) (/ (acos (/ (* -1.0 g) h)) 3.0)))))
double code(double g, double h) {
return 2.0 * cos((((2.0 * ((double) M_PI)) / 3.0) + (acos(((-1.0 * g) / h)) / 3.0)));
}
public static double code(double g, double h) {
return 2.0 * Math.cos((((2.0 * Math.PI) / 3.0) + (Math.acos(((-1.0 * g) / h)) / 3.0)));
}
def code(g, h): return 2.0 * math.cos((((2.0 * math.pi) / 3.0) + (math.acos(((-1.0 * g) / h)) / 3.0)))
function code(g, h) return Float64(2.0 * cos(Float64(Float64(Float64(2.0 * pi) / 3.0) + Float64(acos(Float64(Float64(-1.0 * g) / h)) / 3.0)))) end
function tmp = code(g, h) tmp = 2.0 * cos((((2.0 * pi) / 3.0) + (acos(((-1.0 * g) / h)) / 3.0))); end
code[g_, h_] := N[(2.0 * N[Cos[N[(N[(N[(2.0 * Pi), $MachinePrecision] / 3.0), $MachinePrecision] + N[(N[ArcCos[N[(N[(-1.0 * g), $MachinePrecision] / h), $MachinePrecision]], $MachinePrecision] / 3.0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
2 \cdot \cos \left(\frac{2 \cdot \pi}{3} + \frac{\cos^{-1} \left(\frac{-1 \cdot g}{h}\right)}{3}\right)
\end{array}
Initial program 98.5%
Final simplification98.5%
herbie shell --seed 2025066
(FPCore (g h)
:name "2-ancestry mixing, negative discriminant"
:precision binary64
(* 2.0 (cos (+ (/ (* 2.0 PI) 3.0) (/ (acos (/ (- g) h)) 3.0)))))