
(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 7 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 (* (* (- 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))
(* (fma (* (* zi ux) maxCos) -1.0 (* zi maxCos)) ux))))
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)) + (fmaf(((zi * ux) * maxCos), -1.0f, (zi * maxCos)) * ux);
}
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(fma(Float32(Float32(zi * ux) * maxCos), Float32(-1.0), Float32(zi * maxCos)) * ux)) 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) + \mathsf{fma}\left(\left(zi \cdot ux\right) \cdot maxCos, -1, zi \cdot maxCos\right) \cdot ux
\end{array}
\end{array}
Initial program 98.8%
Taylor expanded in ux around 0
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-fma.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f3298.8
Applied rewrites98.8%
(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(let* ((t_0 (* (* (- 1.0 ux) maxCos) ux)) (t_1 (* (* uy 2.0) PI)))
(+
(+
(* (* (cos t_1) (sqrt (- 1.0 (* t_0 t_0)))) xi)
(*
(*
(sin t_1)
(sqrt
(*
(pow ux 4.0)
(-
(/ 1.0 (pow ux 4.0))
(fma
-2.0
(/ (* maxCos maxCos) ux)
(+ (/ (* maxCos maxCos) (* ux ux)) (* maxCos maxCos)))))))
yi))
(* (fma (* (* zi ux) maxCos) -1.0 (* zi maxCos)) ux))))
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 = (uy * 2.0f) * ((float) M_PI);
return (((cosf(t_1) * sqrtf((1.0f - (t_0 * t_0)))) * xi) + ((sinf(t_1) * sqrtf((powf(ux, 4.0f) * ((1.0f / powf(ux, 4.0f)) - fmaf(-2.0f, ((maxCos * maxCos) / ux), (((maxCos * maxCos) / (ux * ux)) + (maxCos * maxCos))))))) * yi)) + (fmaf(((zi * ux) * maxCos), -1.0f, (zi * maxCos)) * ux);
}
function code(xi, yi, zi, ux, uy, maxCos) t_0 = Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux) t_1 = Float32(Float32(uy * Float32(2.0)) * Float32(pi)) return Float32(Float32(Float32(Float32(cos(t_1) * sqrt(Float32(Float32(1.0) - Float32(t_0 * t_0)))) * xi) + Float32(Float32(sin(t_1) * sqrt(Float32((ux ^ Float32(4.0)) * Float32(Float32(Float32(1.0) / (ux ^ Float32(4.0))) - fma(Float32(-2.0), Float32(Float32(maxCos * maxCos) / ux), Float32(Float32(Float32(maxCos * maxCos) / Float32(ux * ux)) + Float32(maxCos * maxCos))))))) * yi)) + Float32(fma(Float32(Float32(zi * ux) * maxCos), Float32(-1.0), Float32(zi * maxCos)) * ux)) end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\\
t_1 := \left(uy \cdot 2\right) \cdot \pi\\
\left(\left(\cos t\_1 \cdot \sqrt{1 - t\_0 \cdot t\_0}\right) \cdot xi + \left(\sin t\_1 \cdot \sqrt{{ux}^{4} \cdot \left(\frac{1}{{ux}^{4}} - \mathsf{fma}\left(-2, \frac{maxCos \cdot maxCos}{ux}, \frac{maxCos \cdot maxCos}{ux \cdot ux} + maxCos \cdot maxCos\right)\right)}\right) \cdot yi\right) + \mathsf{fma}\left(\left(zi \cdot ux\right) \cdot maxCos, -1, zi \cdot maxCos\right) \cdot ux
\end{array}
\end{array}
Initial program 98.8%
Taylor expanded in ux around 0
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-fma.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f3298.8
Applied rewrites98.8%
Taylor expanded in ux around inf
lower-*.f32N/A
lower-pow.f32N/A
lower--.f32N/A
lower-/.f32N/A
lower-pow.f32N/A
lower-fma.f32N/A
lower-/.f32N/A
pow2N/A
lift-*.f32N/A
lower-+.f32N/A
lower-/.f32N/A
pow2N/A
lift-*.f32N/A
pow2N/A
lift-*.f32N/A
pow2N/A
lift-*.f3298.8
Applied rewrites98.8%
(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(let* ((t_0 (* (* (- 1.0 ux) maxCos) ux)) (t_1 (* (* uy 2.0) PI)))
(+
(+
(* (* (cos t_1) (sqrt (- 1.0 (* t_0 t_0)))) xi)
(*
(*
(sin t_1)
(sqrt
(*
(-
(*
(/
(fma
(- (/ (/ 1.0 (* ux ux)) ux) (/ (* maxCos maxCos) ux))
-1.0
(* -2.0 (* maxCos maxCos)))
ux)
-1.0)
(* maxCos maxCos))
(pow ux 4.0))))
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 = (uy * 2.0f) * ((float) M_PI);
return (((cosf(t_1) * sqrtf((1.0f - (t_0 * t_0)))) * xi) + ((sinf(t_1) * sqrtf(((((fmaf((((1.0f / (ux * ux)) / ux) - ((maxCos * maxCos) / ux)), -1.0f, (-2.0f * (maxCos * maxCos))) / ux) * -1.0f) - (maxCos * maxCos)) * powf(ux, 4.0f)))) * 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 = Float32(Float32(uy * Float32(2.0)) * Float32(pi)) return Float32(Float32(Float32(Float32(cos(t_1) * sqrt(Float32(Float32(1.0) - Float32(t_0 * t_0)))) * xi) + Float32(Float32(sin(t_1) * sqrt(Float32(Float32(Float32(Float32(fma(Float32(Float32(Float32(Float32(1.0) / Float32(ux * ux)) / ux) - Float32(Float32(maxCos * maxCos) / ux)), Float32(-1.0), Float32(Float32(-2.0) * Float32(maxCos * maxCos))) / ux) * Float32(-1.0)) - Float32(maxCos * maxCos)) * (ux ^ Float32(4.0))))) * yi)) + Float32(t_0 * zi)) end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\\
t_1 := \left(uy \cdot 2\right) \cdot \pi\\
\left(\left(\cos t\_1 \cdot \sqrt{1 - t\_0 \cdot t\_0}\right) \cdot xi + \left(\sin t\_1 \cdot \sqrt{\left(\frac{\mathsf{fma}\left(\frac{\frac{1}{ux \cdot ux}}{ux} - \frac{maxCos \cdot maxCos}{ux}, -1, -2 \cdot \left(maxCos \cdot maxCos\right)\right)}{ux} \cdot -1 - maxCos \cdot maxCos\right) \cdot {ux}^{4}}\right) \cdot yi\right) + t\_0 \cdot zi
\end{array}
\end{array}
Initial program 98.8%
Taylor expanded in ux around -inf
*-commutativeN/A
lower-*.f32N/A
Applied rewrites98.7%
(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(let* ((t_0 (* (* (- 1.0 ux) maxCos) ux)) (t_1 (sin (* 2.0 (* uy PI)))))
(+
(+
(* (* (cos (* (* uy 2.0) PI)) (sqrt (- 1.0 (* t_0 t_0)))) xi)
(*
(fma
2.0
(* (sin (* uy PI)) (cos (* uy PI)))
(*
(* ux ux)
(+
(* -0.5 (* (* maxCos maxCos) t_1))
(* (* maxCos maxCos) (* ux t_1)))))
yi))
(* (fma (* (* zi ux) maxCos) -1.0 (* zi maxCos)) ux))))
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 = sinf((2.0f * (uy * ((float) M_PI))));
return (((cosf(((uy * 2.0f) * ((float) M_PI))) * sqrtf((1.0f - (t_0 * t_0)))) * xi) + (fmaf(2.0f, (sinf((uy * ((float) M_PI))) * cosf((uy * ((float) M_PI)))), ((ux * ux) * ((-0.5f * ((maxCos * maxCos) * t_1)) + ((maxCos * maxCos) * (ux * t_1))))) * yi)) + (fmaf(((zi * ux) * maxCos), -1.0f, (zi * maxCos)) * ux);
}
function code(xi, yi, zi, ux, uy, maxCos) t_0 = Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux) t_1 = sin(Float32(Float32(2.0) * Float32(uy * Float32(pi)))) return Float32(Float32(Float32(Float32(cos(Float32(Float32(uy * Float32(2.0)) * Float32(pi))) * sqrt(Float32(Float32(1.0) - Float32(t_0 * t_0)))) * xi) + Float32(fma(Float32(2.0), Float32(sin(Float32(uy * Float32(pi))) * cos(Float32(uy * Float32(pi)))), Float32(Float32(ux * ux) * Float32(Float32(Float32(-0.5) * Float32(Float32(maxCos * maxCos) * t_1)) + Float32(Float32(maxCos * maxCos) * Float32(ux * t_1))))) * yi)) + Float32(fma(Float32(Float32(zi * ux) * maxCos), Float32(-1.0), Float32(zi * maxCos)) * ux)) end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\\
t_1 := \sin \left(2 \cdot \left(uy \cdot \pi\right)\right)\\
\left(\left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \sqrt{1 - t\_0 \cdot t\_0}\right) \cdot xi + \mathsf{fma}\left(2, \sin \left(uy \cdot \pi\right) \cdot \cos \left(uy \cdot \pi\right), \left(ux \cdot ux\right) \cdot \left(-0.5 \cdot \left(\left(maxCos \cdot maxCos\right) \cdot t\_1\right) + \left(maxCos \cdot maxCos\right) \cdot \left(ux \cdot t\_1\right)\right)\right) \cdot yi\right) + \mathsf{fma}\left(\left(zi \cdot ux\right) \cdot maxCos, -1, zi \cdot maxCos\right) \cdot ux
\end{array}
\end{array}
Initial program 98.8%
Taylor expanded in ux around 0
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-fma.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f32N/A
*-commutativeN/A
lower-*.f3298.8
Applied rewrites98.8%
Taylor expanded in ux around 0
sin-2N/A
lower-fma.f32N/A
Applied rewrites98.6%
(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(let* ((t_0
(sqrt
(- 1.0 (* (* (pow (- 1.0 ux) 2.0) (* ux ux)) (* maxCos maxCos))))))
(+
(*
(* -1.0 yi)
(fma
(* (* xi (/ (sin (fma (* PI uy) 2.0 (/ PI 2.0))) yi)) t_0)
-1.0
(* (* -1.0 (sin (* PI (* 2.0 uy)))) t_0)))
(* (* (* (- 1.0 ux) maxCos) ux) zi))))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
float t_0 = sqrtf((1.0f - ((powf((1.0f - ux), 2.0f) * (ux * ux)) * (maxCos * maxCos))));
return ((-1.0f * yi) * fmaf(((xi * (sinf(fmaf((((float) M_PI) * uy), 2.0f, (((float) M_PI) / 2.0f))) / yi)) * t_0), -1.0f, ((-1.0f * sinf((((float) M_PI) * (2.0f * uy)))) * t_0))) + ((((1.0f - ux) * maxCos) * ux) * zi);
}
function code(xi, yi, zi, ux, uy, maxCos) t_0 = sqrt(Float32(Float32(1.0) - Float32(Float32((Float32(Float32(1.0) - ux) ^ Float32(2.0)) * Float32(ux * ux)) * Float32(maxCos * maxCos)))) return Float32(Float32(Float32(Float32(-1.0) * yi) * fma(Float32(Float32(xi * Float32(sin(fma(Float32(Float32(pi) * uy), Float32(2.0), Float32(Float32(pi) / Float32(2.0)))) / yi)) * t_0), Float32(-1.0), Float32(Float32(Float32(-1.0) * sin(Float32(Float32(pi) * Float32(Float32(2.0) * uy)))) * t_0))) + Float32(Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux) * zi)) end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \sqrt{1 - \left({\left(1 - ux\right)}^{2} \cdot \left(ux \cdot ux\right)\right) \cdot \left(maxCos \cdot maxCos\right)}\\
\left(-1 \cdot yi\right) \cdot \mathsf{fma}\left(\left(xi \cdot \frac{\sin \left(\mathsf{fma}\left(\pi \cdot uy, 2, \frac{\pi}{2}\right)\right)}{yi}\right) \cdot t\_0, -1, \left(-1 \cdot \sin \left(\pi \cdot \left(2 \cdot uy\right)\right)\right) \cdot t\_0\right) + \left(\left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\right) \cdot zi
\end{array}
\end{array}
Initial program 98.8%
Taylor expanded in yi around -inf
Applied rewrites98.2%
(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(*
(fma
(sqrt (- 1.0 (* (* (pow (- 1.0 ux) 2.0) (* ux ux)) (* maxCos maxCos))))
(fma
xi
(/ (cos (* (* PI uy) 2.0)) zi)
(* yi (/ (sin (* PI (* 2.0 uy))) zi)))
(* (* (- 1.0 ux) ux) maxCos))
zi))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
return fmaf(sqrtf((1.0f - ((powf((1.0f - ux), 2.0f) * (ux * ux)) * (maxCos * maxCos)))), fmaf(xi, (cosf(((((float) M_PI) * uy) * 2.0f)) / zi), (yi * (sinf((((float) M_PI) * (2.0f * uy))) / zi))), (((1.0f - ux) * ux) * maxCos)) * zi;
}
function code(xi, yi, zi, ux, uy, maxCos) return Float32(fma(sqrt(Float32(Float32(1.0) - Float32(Float32((Float32(Float32(1.0) - ux) ^ Float32(2.0)) * Float32(ux * ux)) * Float32(maxCos * maxCos)))), fma(xi, Float32(cos(Float32(Float32(Float32(pi) * uy) * Float32(2.0))) / zi), Float32(yi * Float32(sin(Float32(Float32(pi) * Float32(Float32(2.0) * uy))) / zi))), Float32(Float32(Float32(Float32(1.0) - ux) * ux) * maxCos)) * zi) end
\begin{array}{l}
\\
\mathsf{fma}\left(\sqrt{1 - \left({\left(1 - ux\right)}^{2} \cdot \left(ux \cdot ux\right)\right) \cdot \left(maxCos \cdot maxCos\right)}, \mathsf{fma}\left(xi, \frac{\cos \left(\left(\pi \cdot uy\right) \cdot 2\right)}{zi}, yi \cdot \frac{\sin \left(\pi \cdot \left(2 \cdot uy\right)\right)}{zi}\right), \left(\left(1 - ux\right) \cdot ux\right) \cdot maxCos\right) \cdot zi
\end{array}
Initial program 98.8%
Taylor expanded in zi around inf
Applied rewrites97.7%
lift-sin.f32N/A
lift-fma.f32N/A
lift-PI.f32N/A
lift-*.f32N/A
lift-PI.f32N/A
lift-/.f32N/A
sin-+PI/2N/A
lower-cos.f32N/A
lower-*.f32N/A
lift-*.f32N/A
lift-PI.f3297.9
Applied rewrites97.9%
(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(let* ((t_0 (* 2.0 (* uy PI))))
(*
(fma
(sqrt (- 1.0 (* (* (pow (- 1.0 ux) 2.0) (* ux ux)) (* maxCos maxCos))))
(* xi (+ (/ (sin (fma 0.5 PI t_0)) zi) (* (/ yi xi) (/ (sin t_0) zi))))
(* (* (- 1.0 ux) ux) maxCos))
zi)))
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
float t_0 = 2.0f * (uy * ((float) M_PI));
return fmaf(sqrtf((1.0f - ((powf((1.0f - ux), 2.0f) * (ux * ux)) * (maxCos * maxCos)))), (xi * ((sinf(fmaf(0.5f, ((float) M_PI), t_0)) / zi) + ((yi / xi) * (sinf(t_0) / zi)))), (((1.0f - ux) * ux) * maxCos)) * zi;
}
function code(xi, yi, zi, ux, uy, maxCos) t_0 = Float32(Float32(2.0) * Float32(uy * Float32(pi))) return Float32(fma(sqrt(Float32(Float32(1.0) - Float32(Float32((Float32(Float32(1.0) - ux) ^ Float32(2.0)) * Float32(ux * ux)) * Float32(maxCos * maxCos)))), Float32(xi * Float32(Float32(sin(fma(Float32(0.5), Float32(pi), t_0)) / zi) + Float32(Float32(yi / xi) * Float32(sin(t_0) / zi)))), Float32(Float32(Float32(Float32(1.0) - ux) * ux) * maxCos)) * zi) end
\begin{array}{l}
\\
\begin{array}{l}
t_0 := 2 \cdot \left(uy \cdot \pi\right)\\
\mathsf{fma}\left(\sqrt{1 - \left({\left(1 - ux\right)}^{2} \cdot \left(ux \cdot ux\right)\right) \cdot \left(maxCos \cdot maxCos\right)}, xi \cdot \left(\frac{\sin \left(\mathsf{fma}\left(0.5, \pi, t\_0\right)\right)}{zi} + \frac{yi}{xi} \cdot \frac{\sin t\_0}{zi}\right), \left(\left(1 - ux\right) \cdot ux\right) \cdot maxCos\right) \cdot zi
\end{array}
\end{array}
Initial program 98.8%
Taylor expanded in zi around inf
Applied rewrites97.7%
Taylor expanded in xi around inf
lower-*.f32N/A
lower-+.f32N/A
Applied rewrites81.1%
herbie shell --seed 2025065
(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)))