
(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(let* ((t_0 (* (* (- 1.0 ux) maxCos) ux))
(t_1 (sqrt (- 1.0 (* t_0 t_0))))
(t_2 (* (* uy 2.0) PI)))
(+ (+ (* (* (cos t_2) t_1) xi) (* (* (sin t_2) t_1) yi)) (* t_0 zi))))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
float t_0 = ((1.0f - ux) * maxCos) * ux;
float t_1 = sqrtf((1.0f - (t_0 * t_0)));
float t_2 = (uy * 2.0f) * ((float) M_PI);
return (((cosf(t_2) * t_1) * xi) + ((sinf(t_2) * t_1) * yi)) + (t_0 * zi);
}
function code(xi, yi, zi, ux, uy, maxCos) t_0 = Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux) t_1 = sqrt(Float32(Float32(1.0) - Float32(t_0 * t_0))) t_2 = Float32(Float32(uy * Float32(2.0)) * Float32(pi)) return Float32(Float32(Float32(Float32(cos(t_2) * t_1) * xi) + Float32(Float32(sin(t_2) * t_1) * yi)) + Float32(t_0 * zi)) end
function tmp = code(xi, yi, zi, ux, uy, maxCos) t_0 = ((single(1.0) - ux) * maxCos) * ux; t_1 = sqrt((single(1.0) - (t_0 * t_0))); t_2 = (uy * single(2.0)) * single(pi); tmp = (((cos(t_2) * t_1) * xi) + ((sin(t_2) * t_1) * yi)) + (t_0 * zi); end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\\
t_1 := \sqrt{1 - t\_0 \cdot t\_0}\\
t_2 := \left(uy \cdot 2\right) \cdot \pi\\
\left(\left(\cos t\_2 \cdot t\_1\right) \cdot xi + \left(\sin t\_2 \cdot t\_1\right) \cdot yi\right) + t\_0 \cdot zi
\end{array}
\end{array}
Sampling outcomes in binary32 precision:
Herbie found 19 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(let* ((t_0 (* (* (- 1.0 ux) maxCos) ux))
(t_1 (sqrt (- 1.0 (* t_0 t_0))))
(t_2 (* (* uy 2.0) PI)))
(+ (+ (* (* (cos t_2) t_1) xi) (* (* (sin t_2) t_1) yi)) (* t_0 zi))))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
float t_0 = ((1.0f - ux) * maxCos) * ux;
float t_1 = sqrtf((1.0f - (t_0 * t_0)));
float t_2 = (uy * 2.0f) * ((float) M_PI);
return (((cosf(t_2) * t_1) * xi) + ((sinf(t_2) * t_1) * yi)) + (t_0 * zi);
}
function code(xi, yi, zi, ux, uy, maxCos) t_0 = Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux) t_1 = sqrt(Float32(Float32(1.0) - Float32(t_0 * t_0))) t_2 = Float32(Float32(uy * Float32(2.0)) * Float32(pi)) return Float32(Float32(Float32(Float32(cos(t_2) * t_1) * xi) + Float32(Float32(sin(t_2) * t_1) * yi)) + Float32(t_0 * zi)) end
function tmp = code(xi, yi, zi, ux, uy, maxCos) t_0 = ((single(1.0) - ux) * maxCos) * ux; t_1 = sqrt((single(1.0) - (t_0 * t_0))); t_2 = (uy * single(2.0)) * single(pi); tmp = (((cos(t_2) * t_1) * xi) + ((sin(t_2) * t_1) * yi)) + (t_0 * zi); end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\\
t_1 := \sqrt{1 - t\_0 \cdot t\_0}\\
t_2 := \left(uy \cdot 2\right) \cdot \pi\\
\left(\left(\cos t\_2 \cdot t\_1\right) \cdot xi + \left(\sin t\_2 \cdot t\_1\right) \cdot yi\right) + t\_0 \cdot zi
\end{array}
\end{array}
(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(let* ((t_0 (* maxCos (- 1.0 ux)))
(t_1 (sqrt (- 1.0 (* (* (* t_0 ux) ux) t_0))))
(t_2 (* (* uy 2.0) PI)))
(fma
(* (- 1.0 ux) zi)
(* maxCos ux)
(fma (* t_1 yi) (sin t_2) (* (cos t_2) (* xi t_1))))))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
float t_0 = maxCos * (1.0f - ux);
float t_1 = sqrtf((1.0f - (((t_0 * ux) * ux) * t_0)));
float t_2 = (uy * 2.0f) * ((float) M_PI);
return fmaf(((1.0f - ux) * zi), (maxCos * ux), fmaf((t_1 * yi), sinf(t_2), (cosf(t_2) * (xi * t_1))));
}
function code(xi, yi, zi, ux, uy, maxCos) t_0 = Float32(maxCos * Float32(Float32(1.0) - ux)) t_1 = sqrt(Float32(Float32(1.0) - Float32(Float32(Float32(t_0 * ux) * ux) * t_0))) t_2 = Float32(Float32(uy * Float32(2.0)) * Float32(pi)) return fma(Float32(Float32(Float32(1.0) - ux) * zi), Float32(maxCos * ux), fma(Float32(t_1 * yi), sin(t_2), Float32(cos(t_2) * Float32(xi * t_1)))) end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := maxCos \cdot \left(1 - ux\right)\\
t_1 := \sqrt{1 - \left(\left(t\_0 \cdot ux\right) \cdot ux\right) \cdot t\_0}\\
t_2 := \left(uy \cdot 2\right) \cdot \pi\\
\mathsf{fma}\left(\left(1 - ux\right) \cdot zi, maxCos \cdot ux, \mathsf{fma}\left(t\_1 \cdot yi, \sin t\_2, \cos t\_2 \cdot \left(xi \cdot t\_1\right)\right)\right)
\end{array}
\end{array}
Initial program 98.9%
lift-+.f32N/A
+-commutativeN/A
lift-*.f32N/A
*-commutativeN/A
lift-*.f32N/A
lift-*.f32N/A
associate-*l*N/A
associate-*r*N/A
Applied rewrites99.0%
Final simplification99.0%
(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(let* ((t_0 (* (* uy PI) 2.0)) (t_1 (cos t_0)))
(if (<= (* uy 2.0) 0.049949999898672104)
(fma
(* (- 1.0 ux) zi)
(* maxCos ux)
(fma
(*
(fma (* (* uy uy) -1.3333333333333333) (* (* PI PI) PI) (* 2.0 PI))
uy)
yi
(* t_1 xi)))
(* (fma yi (/ (sin t_0) xi) t_1) xi))))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
float t_0 = (uy * ((float) M_PI)) * 2.0f;
float t_1 = cosf(t_0);
float tmp;
if ((uy * 2.0f) <= 0.049949999898672104f) {
tmp = fmaf(((1.0f - ux) * zi), (maxCos * ux), fmaf((fmaf(((uy * uy) * -1.3333333333333333f), ((((float) M_PI) * ((float) M_PI)) * ((float) M_PI)), (2.0f * ((float) M_PI))) * uy), yi, (t_1 * xi)));
} else {
tmp = fmaf(yi, (sinf(t_0) / xi), t_1) * xi;
}
return tmp;
}
function code(xi, yi, zi, ux, uy, maxCos) t_0 = Float32(Float32(uy * Float32(pi)) * Float32(2.0)) t_1 = cos(t_0) tmp = Float32(0.0) if (Float32(uy * Float32(2.0)) <= Float32(0.049949999898672104)) tmp = fma(Float32(Float32(Float32(1.0) - ux) * zi), Float32(maxCos * ux), fma(Float32(fma(Float32(Float32(uy * uy) * Float32(-1.3333333333333333)), Float32(Float32(Float32(pi) * Float32(pi)) * Float32(pi)), Float32(Float32(2.0) * Float32(pi))) * uy), yi, Float32(t_1 * xi))); else tmp = Float32(fma(yi, Float32(sin(t_0) / xi), t_1) * xi); end return tmp end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(uy \cdot \pi\right) \cdot 2\\
t_1 := \cos t\_0\\
\mathbf{if}\;uy \cdot 2 \leq 0.049949999898672104:\\
\;\;\;\;\mathsf{fma}\left(\left(1 - ux\right) \cdot zi, maxCos \cdot ux, \mathsf{fma}\left(\mathsf{fma}\left(\left(uy \cdot uy\right) \cdot -1.3333333333333333, \left(\pi \cdot \pi\right) \cdot \pi, 2 \cdot \pi\right) \cdot uy, yi, t\_1 \cdot xi\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(yi, \frac{\sin t\_0}{xi}, t\_1\right) \cdot xi\\
\end{array}
\end{array}
if (*.f32 uy #s(literal 2 binary32)) < 0.0499499999Initial program 99.1%
lift-+.f32N/A
+-commutativeN/A
lift-*.f32N/A
*-commutativeN/A
lift-*.f32N/A
lift-*.f32N/A
associate-*l*N/A
associate-*r*N/A
Applied rewrites99.3%
Taylor expanded in maxCos around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
lower-sin.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-cos.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f3299.0
Applied rewrites99.0%
Taylor expanded in uy around 0
Applied rewrites98.9%
if 0.0499499999 < (*.f32 uy #s(literal 2 binary32)) Initial program 97.6%
Taylor expanded in xi around inf
Applied rewrites97.5%
Taylor expanded in ux around 0
Applied rewrites95.2%
Final simplification98.3%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (let* ((t_0 (* (* uy PI) 2.0))) (fma (* (- 1.0 ux) zi) (* maxCos ux) (fma (sin t_0) yi (* (cos t_0) xi)))))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
float t_0 = (uy * ((float) M_PI)) * 2.0f;
return fmaf(((1.0f - ux) * zi), (maxCos * ux), fmaf(sinf(t_0), yi, (cosf(t_0) * xi)));
}
function code(xi, yi, zi, ux, uy, maxCos) t_0 = Float32(Float32(uy * Float32(pi)) * Float32(2.0)) return fma(Float32(Float32(Float32(1.0) - ux) * zi), Float32(maxCos * ux), fma(sin(t_0), yi, Float32(cos(t_0) * xi))) end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(uy \cdot \pi\right) \cdot 2\\
\mathsf{fma}\left(\left(1 - ux\right) \cdot zi, maxCos \cdot ux, \mathsf{fma}\left(\sin t\_0, yi, \cos t\_0 \cdot xi\right)\right)
\end{array}
\end{array}
Initial program 98.9%
lift-+.f32N/A
+-commutativeN/A
lift-*.f32N/A
*-commutativeN/A
lift-*.f32N/A
lift-*.f32N/A
associate-*l*N/A
associate-*r*N/A
Applied rewrites99.0%
Taylor expanded in maxCos around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
lower-sin.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-cos.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f3298.8
Applied rewrites98.8%
Final simplification98.8%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (let* ((t_0 (* (* uy PI) 2.0))) (fma (sin t_0) yi (fma (cos t_0) xi (* (* (* (- 1.0 ux) zi) ux) maxCos)))))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
float t_0 = (uy * ((float) M_PI)) * 2.0f;
return fmaf(sinf(t_0), yi, fmaf(cosf(t_0), xi, ((((1.0f - ux) * zi) * ux) * maxCos)));
}
function code(xi, yi, zi, ux, uy, maxCos) t_0 = Float32(Float32(uy * Float32(pi)) * Float32(2.0)) return fma(sin(t_0), yi, fma(cos(t_0), xi, Float32(Float32(Float32(Float32(Float32(1.0) - ux) * zi) * ux) * maxCos))) end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(uy \cdot \pi\right) \cdot 2\\
\mathsf{fma}\left(\sin t\_0, yi, \mathsf{fma}\left(\cos t\_0, xi, \left(\left(\left(1 - ux\right) \cdot zi\right) \cdot ux\right) \cdot maxCos\right)\right)
\end{array}
\end{array}
Initial program 98.9%
Taylor expanded in maxCos around 0
associate-+r+N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
lower-sin.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f32N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
Applied rewrites98.7%
Final simplification98.7%
(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(let* ((t_0 (* (* uy PI) 2.0)) (t_1 (* (cos t_0) xi)))
(if (<= (* uy 2.0) 0.049949999898672104)
(fma
(* (- 1.0 ux) zi)
(* maxCos ux)
(fma
(*
(fma (* (* uy uy) -1.3333333333333333) (* (* PI PI) PI) (* 2.0 PI))
uy)
yi
t_1))
(fma (sin t_0) yi t_1))))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
float t_0 = (uy * ((float) M_PI)) * 2.0f;
float t_1 = cosf(t_0) * xi;
float tmp;
if ((uy * 2.0f) <= 0.049949999898672104f) {
tmp = fmaf(((1.0f - ux) * zi), (maxCos * ux), fmaf((fmaf(((uy * uy) * -1.3333333333333333f), ((((float) M_PI) * ((float) M_PI)) * ((float) M_PI)), (2.0f * ((float) M_PI))) * uy), yi, t_1));
} else {
tmp = fmaf(sinf(t_0), yi, t_1);
}
return tmp;
}
function code(xi, yi, zi, ux, uy, maxCos) t_0 = Float32(Float32(uy * Float32(pi)) * Float32(2.0)) t_1 = Float32(cos(t_0) * xi) tmp = Float32(0.0) if (Float32(uy * Float32(2.0)) <= Float32(0.049949999898672104)) tmp = fma(Float32(Float32(Float32(1.0) - ux) * zi), Float32(maxCos * ux), fma(Float32(fma(Float32(Float32(uy * uy) * Float32(-1.3333333333333333)), Float32(Float32(Float32(pi) * Float32(pi)) * Float32(pi)), Float32(Float32(2.0) * Float32(pi))) * uy), yi, t_1)); else tmp = fma(sin(t_0), yi, t_1); end return tmp end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(uy \cdot \pi\right) \cdot 2\\
t_1 := \cos t\_0 \cdot xi\\
\mathbf{if}\;uy \cdot 2 \leq 0.049949999898672104:\\
\;\;\;\;\mathsf{fma}\left(\left(1 - ux\right) \cdot zi, maxCos \cdot ux, \mathsf{fma}\left(\mathsf{fma}\left(\left(uy \cdot uy\right) \cdot -1.3333333333333333, \left(\pi \cdot \pi\right) \cdot \pi, 2 \cdot \pi\right) \cdot uy, yi, t\_1\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\sin t\_0, yi, t\_1\right)\\
\end{array}
\end{array}
if (*.f32 uy #s(literal 2 binary32)) < 0.0499499999Initial program 99.1%
lift-+.f32N/A
+-commutativeN/A
lift-*.f32N/A
*-commutativeN/A
lift-*.f32N/A
lift-*.f32N/A
associate-*l*N/A
associate-*r*N/A
Applied rewrites99.3%
Taylor expanded in maxCos around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
lower-sin.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-cos.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f3299.0
Applied rewrites99.0%
Taylor expanded in uy around 0
Applied rewrites98.9%
if 0.0499499999 < (*.f32 uy #s(literal 2 binary32)) Initial program 97.6%
Taylor expanded in ux around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
lower-sin.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-cos.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f3295.1
Applied rewrites95.1%
Final simplification98.3%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (let* ((t_0 (* (* uy PI) 2.0))) (fma (* maxCos ux) zi (fma (sin t_0) yi (* (cos t_0) xi)))))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
float t_0 = (uy * ((float) M_PI)) * 2.0f;
return fmaf((maxCos * ux), zi, fmaf(sinf(t_0), yi, (cosf(t_0) * xi)));
}
function code(xi, yi, zi, ux, uy, maxCos) t_0 = Float32(Float32(uy * Float32(pi)) * Float32(2.0)) return fma(Float32(maxCos * ux), zi, fma(sin(t_0), yi, Float32(cos(t_0) * xi))) end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(uy \cdot \pi\right) \cdot 2\\
\mathsf{fma}\left(maxCos \cdot ux, zi, \mathsf{fma}\left(\sin t\_0, yi, \cos t\_0 \cdot xi\right)\right)
\end{array}
\end{array}
Initial program 98.9%
Taylor expanded in zi around inf
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-*.f32N/A
lower--.f3211.1
Applied rewrites11.1%
Taylor expanded in ux around 0
associate-*r*N/A
lower-fma.f32N/A
*-commutativeN/A
lower-*.f32N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
lower-sin.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f32N/A
*-commutativeN/A
lower-*.f32N/A
Applied rewrites97.1%
Final simplification97.1%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (let* ((t_0 (* (* uy PI) 2.0))) (fma (sin t_0) yi (fma (cos t_0) xi (* (* ux zi) maxCos)))))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
float t_0 = (uy * ((float) M_PI)) * 2.0f;
return fmaf(sinf(t_0), yi, fmaf(cosf(t_0), xi, ((ux * zi) * maxCos)));
}
function code(xi, yi, zi, ux, uy, maxCos) t_0 = Float32(Float32(uy * Float32(pi)) * Float32(2.0)) return fma(sin(t_0), yi, fma(cos(t_0), xi, Float32(Float32(ux * zi) * maxCos))) end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(uy \cdot \pi\right) \cdot 2\\
\mathsf{fma}\left(\sin t\_0, yi, \mathsf{fma}\left(\cos t\_0, xi, \left(ux \cdot zi\right) \cdot maxCos\right)\right)
\end{array}
\end{array}
Initial program 98.9%
Taylor expanded in ux around 0
associate-+r+N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
lower-sin.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f32N/A
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
Applied rewrites97.1%
Final simplification97.1%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (fma (* (- 1.0 ux) zi) (* maxCos ux) (fma (* (fma (* (* uy uy) -1.3333333333333333) (* (* PI PI) PI) (* 2.0 PI)) uy) yi (* (cos (* (* uy PI) 2.0)) xi))))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
return fmaf(((1.0f - ux) * zi), (maxCos * ux), fmaf((fmaf(((uy * uy) * -1.3333333333333333f), ((((float) M_PI) * ((float) M_PI)) * ((float) M_PI)), (2.0f * ((float) M_PI))) * uy), yi, (cosf(((uy * ((float) M_PI)) * 2.0f)) * xi)));
}
function code(xi, yi, zi, ux, uy, maxCos) return fma(Float32(Float32(Float32(1.0) - ux) * zi), Float32(maxCos * ux), fma(Float32(fma(Float32(Float32(uy * uy) * Float32(-1.3333333333333333)), Float32(Float32(Float32(pi) * Float32(pi)) * Float32(pi)), Float32(Float32(2.0) * Float32(pi))) * uy), yi, Float32(cos(Float32(Float32(uy * Float32(pi)) * Float32(2.0))) * xi))) end
\begin{array}{l}
\\
\mathsf{fma}\left(\left(1 - ux\right) \cdot zi, maxCos \cdot ux, \mathsf{fma}\left(\mathsf{fma}\left(\left(uy \cdot uy\right) \cdot -1.3333333333333333, \left(\pi \cdot \pi\right) \cdot \pi, 2 \cdot \pi\right) \cdot uy, yi, \cos \left(\left(uy \cdot \pi\right) \cdot 2\right) \cdot xi\right)\right)
\end{array}
Initial program 98.9%
lift-+.f32N/A
+-commutativeN/A
lift-*.f32N/A
*-commutativeN/A
lift-*.f32N/A
lift-*.f32N/A
associate-*l*N/A
associate-*r*N/A
Applied rewrites99.0%
Taylor expanded in maxCos around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
lower-sin.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-cos.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f3298.8
Applied rewrites98.8%
Taylor expanded in uy around 0
Applied rewrites94.0%
Final simplification94.0%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (let* ((t_0 (* (* uy PI) 2.0))) (fma (* (- 1.0 ux) zi) (* maxCos ux) (fma t_0 yi (* (cos t_0) xi)))))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
float t_0 = (uy * ((float) M_PI)) * 2.0f;
return fmaf(((1.0f - ux) * zi), (maxCos * ux), fmaf(t_0, yi, (cosf(t_0) * xi)));
}
function code(xi, yi, zi, ux, uy, maxCos) t_0 = Float32(Float32(uy * Float32(pi)) * Float32(2.0)) return fma(Float32(Float32(Float32(1.0) - ux) * zi), Float32(maxCos * ux), fma(t_0, yi, Float32(cos(t_0) * xi))) end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(uy \cdot \pi\right) \cdot 2\\
\mathsf{fma}\left(\left(1 - ux\right) \cdot zi, maxCos \cdot ux, \mathsf{fma}\left(t\_0, yi, \cos t\_0 \cdot xi\right)\right)
\end{array}
\end{array}
Initial program 98.9%
lift-+.f32N/A
+-commutativeN/A
lift-*.f32N/A
*-commutativeN/A
lift-*.f32N/A
lift-*.f32N/A
associate-*l*N/A
associate-*r*N/A
Applied rewrites99.0%
Taylor expanded in maxCos around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
lower-sin.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-cos.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f3298.8
Applied rewrites98.8%
Taylor expanded in uy around 0
Applied rewrites90.3%
Final simplification90.3%
(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(fma
(* (- 1.0 ux) zi)
(* maxCos ux)
(fma
(fma
(fma
(* (* (* (* PI PI) PI) yi) uy)
-1.3333333333333333
(* -2.0 (* (* PI PI) xi)))
uy
(* (* PI yi) 2.0))
uy
xi)))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
return fmaf(((1.0f - ux) * zi), (maxCos * ux), fmaf(fmaf(fmaf(((((((float) M_PI) * ((float) M_PI)) * ((float) M_PI)) * yi) * uy), -1.3333333333333333f, (-2.0f * ((((float) M_PI) * ((float) M_PI)) * xi))), uy, ((((float) M_PI) * yi) * 2.0f)), uy, xi));
}
function code(xi, yi, zi, ux, uy, maxCos) return fma(Float32(Float32(Float32(1.0) - ux) * zi), Float32(maxCos * ux), fma(fma(fma(Float32(Float32(Float32(Float32(Float32(pi) * Float32(pi)) * Float32(pi)) * yi) * uy), Float32(-1.3333333333333333), Float32(Float32(-2.0) * Float32(Float32(Float32(pi) * Float32(pi)) * xi))), uy, Float32(Float32(Float32(pi) * yi) * Float32(2.0))), uy, xi)) end
\begin{array}{l}
\\
\mathsf{fma}\left(\left(1 - ux\right) \cdot zi, maxCos \cdot ux, \mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(\left(\left(\left(\pi \cdot \pi\right) \cdot \pi\right) \cdot yi\right) \cdot uy, -1.3333333333333333, -2 \cdot \left(\left(\pi \cdot \pi\right) \cdot xi\right)\right), uy, \left(\pi \cdot yi\right) \cdot 2\right), uy, xi\right)\right)
\end{array}
Initial program 98.9%
lift-+.f32N/A
+-commutativeN/A
lift-*.f32N/A
*-commutativeN/A
lift-*.f32N/A
lift-*.f32N/A
associate-*l*N/A
associate-*r*N/A
Applied rewrites99.0%
Taylor expanded in maxCos around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
lower-sin.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-cos.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f3298.8
Applied rewrites98.8%
Taylor expanded in uy around 0
Applied rewrites89.5%
Final simplification89.5%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (fma (* (- 1.0 ux) zi) (* maxCos ux) (fma (fma (* (* (* PI PI) xi) uy) -2.0 (* (* PI yi) 2.0)) uy xi)))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
return fmaf(((1.0f - ux) * zi), (maxCos * ux), fmaf(fmaf((((((float) M_PI) * ((float) M_PI)) * xi) * uy), -2.0f, ((((float) M_PI) * yi) * 2.0f)), uy, xi));
}
function code(xi, yi, zi, ux, uy, maxCos) return fma(Float32(Float32(Float32(1.0) - ux) * zi), Float32(maxCos * ux), fma(fma(Float32(Float32(Float32(Float32(pi) * Float32(pi)) * xi) * uy), Float32(-2.0), Float32(Float32(Float32(pi) * yi) * Float32(2.0))), uy, xi)) end
\begin{array}{l}
\\
\mathsf{fma}\left(\left(1 - ux\right) \cdot zi, maxCos \cdot ux, \mathsf{fma}\left(\mathsf{fma}\left(\left(\left(\pi \cdot \pi\right) \cdot xi\right) \cdot uy, -2, \left(\pi \cdot yi\right) \cdot 2\right), uy, xi\right)\right)
\end{array}
Initial program 98.9%
lift-+.f32N/A
+-commutativeN/A
lift-*.f32N/A
*-commutativeN/A
lift-*.f32N/A
lift-*.f32N/A
associate-*l*N/A
associate-*r*N/A
Applied rewrites99.0%
Taylor expanded in maxCos around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
lower-sin.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-cos.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f3298.8
Applied rewrites98.8%
Taylor expanded in uy around 0
Applied rewrites86.2%
Final simplification86.2%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (fma (* (- 1.0 ux) zi) (* maxCos ux) (fma (* (* PI yi) uy) 2.0 xi)))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
return fmaf(((1.0f - ux) * zi), (maxCos * ux), fmaf(((((float) M_PI) * yi) * uy), 2.0f, xi));
}
function code(xi, yi, zi, ux, uy, maxCos) return fma(Float32(Float32(Float32(1.0) - ux) * zi), Float32(maxCos * ux), fma(Float32(Float32(Float32(pi) * yi) * uy), Float32(2.0), xi)) end
\begin{array}{l}
\\
\mathsf{fma}\left(\left(1 - ux\right) \cdot zi, maxCos \cdot ux, \mathsf{fma}\left(\left(\pi \cdot yi\right) \cdot uy, 2, xi\right)\right)
\end{array}
Initial program 98.9%
lift-+.f32N/A
+-commutativeN/A
lift-*.f32N/A
*-commutativeN/A
lift-*.f32N/A
lift-*.f32N/A
associate-*l*N/A
associate-*r*N/A
Applied rewrites99.0%
Taylor expanded in maxCos around 0
+-commutativeN/A
*-commutativeN/A
lower-fma.f32N/A
lower-sin.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-cos.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-PI.f3298.8
Applied rewrites98.8%
Taylor expanded in uy around 0
Applied rewrites82.0%
Final simplification82.0%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (fma (* (* (- 1.0 ux) zi) ux) maxCos (fma (* (* PI yi) uy) 2.0 xi)))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
return fmaf((((1.0f - ux) * zi) * ux), maxCos, fmaf(((((float) M_PI) * yi) * uy), 2.0f, xi));
}
function code(xi, yi, zi, ux, uy, maxCos) return fma(Float32(Float32(Float32(Float32(1.0) - ux) * zi) * ux), maxCos, fma(Float32(Float32(Float32(pi) * yi) * uy), Float32(2.0), xi)) end
\begin{array}{l}
\\
\mathsf{fma}\left(\left(\left(1 - ux\right) \cdot zi\right) \cdot ux, maxCos, \mathsf{fma}\left(\left(\pi \cdot yi\right) \cdot uy, 2, xi\right)\right)
\end{array}
Initial program 98.9%
Taylor expanded in uy around 0
+-commutativeN/A
associate-+r+N/A
associate-*r*N/A
distribute-rgt-outN/A
Applied rewrites82.2%
Taylor expanded in maxCos around 0
Applied rewrites82.0%
Final simplification82.0%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (fma (* ux zi) maxCos (fma (* (* PI yi) uy) 2.0 xi)))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
return fmaf((ux * zi), maxCos, fmaf(((((float) M_PI) * yi) * uy), 2.0f, xi));
}
function code(xi, yi, zi, ux, uy, maxCos) return fma(Float32(ux * zi), maxCos, fma(Float32(Float32(Float32(pi) * yi) * uy), Float32(2.0), xi)) end
\begin{array}{l}
\\
\mathsf{fma}\left(ux \cdot zi, maxCos, \mathsf{fma}\left(\left(\pi \cdot yi\right) \cdot uy, 2, xi\right)\right)
\end{array}
Initial program 98.9%
Taylor expanded in uy around 0
+-commutativeN/A
associate-+r+N/A
associate-*r*N/A
distribute-rgt-outN/A
Applied rewrites82.2%
Taylor expanded in ux around 0
Applied rewrites80.7%
Final simplification80.7%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (fma (* (* PI yi) uy) 2.0 xi))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
return fmaf(((((float) M_PI) * yi) * uy), 2.0f, xi);
}
function code(xi, yi, zi, ux, uy, maxCos) return fma(Float32(Float32(Float32(pi) * yi) * uy), Float32(2.0), xi) end
\begin{array}{l}
\\
\mathsf{fma}\left(\left(\pi \cdot yi\right) \cdot uy, 2, xi\right)
\end{array}
Initial program 98.9%
Taylor expanded in uy around 0
+-commutativeN/A
associate-+r+N/A
associate-*r*N/A
distribute-rgt-outN/A
Applied rewrites82.2%
Taylor expanded in ux around 0
Applied rewrites77.1%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (fma (* (* uy yi) PI) 2.0 xi))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
return fmaf(((uy * yi) * ((float) M_PI)), 2.0f, xi);
}
function code(xi, yi, zi, ux, uy, maxCos) return fma(Float32(Float32(uy * yi) * Float32(pi)), Float32(2.0), xi) end
\begin{array}{l}
\\
\mathsf{fma}\left(\left(uy \cdot yi\right) \cdot \pi, 2, xi\right)
\end{array}
Initial program 98.9%
Taylor expanded in uy around 0
+-commutativeN/A
associate-+r+N/A
associate-*r*N/A
distribute-rgt-outN/A
Applied rewrites82.2%
Taylor expanded in ux around 0
Applied rewrites77.1%
Applied rewrites77.1%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (fma yi (* (* uy PI) 2.0) xi))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
return fmaf(yi, ((uy * ((float) M_PI)) * 2.0f), xi);
}
function code(xi, yi, zi, ux, uy, maxCos) return fma(yi, Float32(Float32(uy * Float32(pi)) * Float32(2.0)), xi) end
\begin{array}{l}
\\
\mathsf{fma}\left(yi, \left(uy \cdot \pi\right) \cdot 2, xi\right)
\end{array}
Initial program 98.9%
Taylor expanded in uy around 0
+-commutativeN/A
associate-+r+N/A
associate-*r*N/A
distribute-rgt-outN/A
Applied rewrites82.2%
Taylor expanded in ux around 0
Applied rewrites77.1%
Applied rewrites77.1%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (* (* (* PI yi) uy) 2.0))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
return ((((float) M_PI) * yi) * uy) * 2.0f;
}
function code(xi, yi, zi, ux, uy, maxCos) return Float32(Float32(Float32(Float32(pi) * yi) * uy) * Float32(2.0)) end
function tmp = code(xi, yi, zi, ux, uy, maxCos) tmp = ((single(pi) * yi) * uy) * single(2.0); end
\begin{array}{l}
\\
\left(\left(\pi \cdot yi\right) \cdot uy\right) \cdot 2
\end{array}
Initial program 98.9%
Taylor expanded in uy around 0
+-commutativeN/A
associate-+r+N/A
associate-*r*N/A
distribute-rgt-outN/A
Applied rewrites82.2%
Taylor expanded in ux around 0
Applied rewrites77.1%
Taylor expanded in yi around inf
Applied rewrites36.0%
Final simplification36.0%
(FPCore (xi yi zi ux uy maxCos) :precision binary32 (* (* ux zi) maxCos))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
return (ux * zi) * maxCos;
}
real(4) function code(xi, yi, zi, ux, uy, maxcos)
real(4), intent (in) :: xi
real(4), intent (in) :: yi
real(4), intent (in) :: zi
real(4), intent (in) :: ux
real(4), intent (in) :: uy
real(4), intent (in) :: maxcos
code = (ux * zi) * maxcos
end function
function code(xi, yi, zi, ux, uy, maxCos) return Float32(Float32(ux * zi) * maxCos) end
function tmp = code(xi, yi, zi, ux, uy, maxCos) tmp = (ux * zi) * maxCos; end
\begin{array}{l}
\\
\left(ux \cdot zi\right) \cdot maxCos
\end{array}
Initial program 98.9%
Taylor expanded in zi around inf
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
lower-*.f32N/A
lower--.f3211.1
Applied rewrites11.1%
Taylor expanded in ux around 0
Applied rewrites10.5%
Final simplification10.5%
herbie shell --seed 2024235
(FPCore (xi yi zi ux uy maxCos)
:name "UniformSampleCone 2"
:precision binary32
:pre (and (and (and (and (and (and (<= -10000.0 xi) (<= xi 10000.0)) (and (<= -10000.0 yi) (<= yi 10000.0))) (and (<= -10000.0 zi) (<= zi 10000.0))) (and (<= 2.328306437e-10 ux) (<= ux 1.0))) (and (<= 2.328306437e-10 uy) (<= uy 1.0))) (and (<= 0.0 maxCos) (<= maxCos 1.0)))
(+ (+ (* (* (cos (* (* uy 2.0) PI)) (sqrt (- 1.0 (* (* (* (- 1.0 ux) maxCos) ux) (* (* (- 1.0 ux) maxCos) ux))))) xi) (* (* (sin (* (* uy 2.0) PI)) (sqrt (- 1.0 (* (* (* (- 1.0 ux) maxCos) ux) (* (* (- 1.0 ux) maxCos) ux))))) yi)) (* (* (* (- 1.0 ux) maxCos) ux) zi)))