
(FPCore (g a) :precision binary32 (cbrt (/ g (* 2.0 a))))
float code(float g, float a) {
return cbrtf((g / (2.0f * a)));
}
function code(g, a) return cbrt(Float32(g / Float32(Float32(2.0) * a))) end
\begin{array}{l}
\\
\sqrt[3]{\frac{g}{2 \cdot a}}
\end{array}
Sampling outcomes in binary32 precision:
Herbie found 4 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (g a) :precision binary32 (cbrt (/ g (* 2.0 a))))
float code(float g, float a) {
return cbrtf((g / (2.0f * a)));
}
function code(g, a) return cbrt(Float32(g / Float32(Float32(2.0) * a))) end
\begin{array}{l}
\\
\sqrt[3]{\frac{g}{2 \cdot a}}
\end{array}
(FPCore (g a) :precision binary32 (/ (cbrt (* 0.5 g)) (cbrt a)))
float code(float g, float a) {
return cbrtf((0.5f * g)) / cbrtf(a);
}
function code(g, a) return Float32(cbrt(Float32(Float32(0.5) * g)) / cbrt(a)) end
\begin{array}{l}
\\
\frac{\sqrt[3]{0.5 \cdot g}}{\sqrt[3]{a}}
\end{array}
Initial program 82.8%
lift-cbrt.f32N/A
lift-*.f32N/A
lift-/.f32N/A
associate-/r*N/A
cbrt-divN/A
lower-/.f32N/A
lower-cbrt.f32N/A
lower-/.f32N/A
lower-cbrt.f3299.0
Applied rewrites99.0%
Taylor expanded in g around 0
lower-*.f3299.0
Applied rewrites99.0%
(FPCore (g a) :precision binary32 (* (cbrt (/ 0.5 a)) (cbrt g)))
float code(float g, float a) {
return cbrtf((0.5f / a)) * cbrtf(g);
}
function code(g, a) return Float32(cbrt(Float32(Float32(0.5) / a)) * cbrt(g)) end
\begin{array}{l}
\\
\sqrt[3]{\frac{0.5}{a}} \cdot \sqrt[3]{g}
\end{array}
Initial program 82.8%
lift-cbrt.f32N/A
lift-*.f32N/A
lift-/.f32N/A
cbrt-divN/A
lower-/.f32N/A
lower-cbrt.f32N/A
lower-cbrt.f32N/A
*-commutativeN/A
lower-*.f3298.5
Applied rewrites98.5%
Taylor expanded in g around 0
*-commutativeN/A
cbrt-divN/A
associate-/r*N/A
cbrt-undivN/A
*-commutativeN/A
lower-*.f32N/A
lower-/.f32N/A
lower-cbrt.f32N/A
lower-cbrt.f32N/A
lift-/.f3283.1
Applied rewrites83.1%
lift-*.f32N/A
lift-/.f32N/A
lift-cbrt.f32N/A
lift-/.f32N/A
lift-cbrt.f32N/A
*-commutativeN/A
lower-*.f32N/A
lift-cbrt.f32N/A
lift-/.f32N/A
lift-cbrt.f32N/A
metadata-evalN/A
metadata-evalN/A
cbrt-unprodN/A
associate-*r/N/A
lift-cbrt.f32N/A
cbrt-undivN/A
metadata-evalN/A
cbrt-unprodN/A
metadata-evalN/A
lower-cbrt.f3283.1
Applied rewrites83.1%
lift-*.f32N/A
lift-/.f32N/A
lift-cbrt.f32N/A
cbrt-divN/A
associate-*l/N/A
associate-/l*N/A
*-commutativeN/A
lower-*.f32N/A
lift-cbrt.f32N/A
cbrt-undivN/A
lower-cbrt.f32N/A
lower-/.f32N/A
lift-cbrt.f3298.6
Applied rewrites98.6%
(FPCore (g a) :precision binary32 (cbrt (* 0.5 (/ g a))))
float code(float g, float a) {
return cbrtf((0.5f * (g / a)));
}
function code(g, a) return cbrt(Float32(Float32(0.5) * Float32(g / a))) end
\begin{array}{l}
\\
\sqrt[3]{0.5 \cdot \frac{g}{a}}
\end{array}
Initial program 82.8%
Taylor expanded in g around 0
lower-*.f32N/A
lower-/.f3283.2
Applied rewrites83.2%
(FPCore (g a) :precision binary32 (cbrt (/ g (+ a a))))
float code(float g, float a) {
return cbrtf((g / (a + a)));
}
function code(g, a) return cbrt(Float32(g / Float32(a + a))) end
\begin{array}{l}
\\
\sqrt[3]{\frac{g}{a + a}}
\end{array}
Initial program 82.8%
lift-*.f32N/A
count-2-revN/A
lower-+.f3282.8
Applied rewrites82.8%
herbie shell --seed 2025054
(FPCore (g a)
:name "2-ancestry mixing, zero discriminant"
:precision binary32
(cbrt (/ g (* 2.0 a))))