(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(+
(+
(*
(*
(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)))(FPCore (xi yi zi ux uy maxCos)
:precision binary32
(let* ((t_0 (* (- 1.0 ux) maxCos)) (t_1 (* t_0 ux)) (t_2 (* (* uy 2.0) PI)))
(+
(fma
(* (cos t_2) (sqrt (- 1.0 (* t_1 t_1))))
xi
(*
(* (sin t_2) (sqrt (- 1.0 (- (exp (log1p (pow (* ux t_0) 2.0))) 1.0))))
yi))
(* (* maxCos (- ux (pow ux 2.0))) zi))))float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
return (((cosf(((uy * 2.0f) * ((float) M_PI))) * sqrtf((1.0f - ((((1.0f - ux) * maxCos) * ux) * (((1.0f - ux) * maxCos) * ux))))) * xi) + ((sinf(((uy * 2.0f) * ((float) M_PI))) * sqrtf((1.0f - ((((1.0f - ux) * maxCos) * ux) * (((1.0f - ux) * maxCos) * ux))))) * yi)) + ((((1.0f - ux) * maxCos) * ux) * zi);
}
float code(float xi, float yi, float zi, float ux, float uy, float maxCos) {
float t_0 = (1.0f - ux) * maxCos;
float t_1 = t_0 * ux;
float t_2 = (uy * 2.0f) * ((float) M_PI);
return fmaf((cosf(t_2) * sqrtf((1.0f - (t_1 * t_1)))), xi, ((sinf(t_2) * sqrtf((1.0f - (expf(log1pf(powf((ux * t_0), 2.0f))) - 1.0f)))) * yi)) + ((maxCos * (ux - powf(ux, 2.0f))) * zi);
}
function code(xi, yi, zi, ux, uy, maxCos) return Float32(Float32(Float32(Float32(cos(Float32(Float32(uy * Float32(2.0)) * Float32(pi))) * sqrt(Float32(Float32(1.0) - Float32(Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux) * Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux))))) * xi) + Float32(Float32(sin(Float32(Float32(uy * Float32(2.0)) * Float32(pi))) * sqrt(Float32(Float32(1.0) - Float32(Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux) * Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux))))) * yi)) + Float32(Float32(Float32(Float32(Float32(1.0) - ux) * maxCos) * ux) * zi)) end
function code(xi, yi, zi, ux, uy, maxCos) t_0 = Float32(Float32(Float32(1.0) - ux) * maxCos) t_1 = Float32(t_0 * ux) t_2 = Float32(Float32(uy * Float32(2.0)) * Float32(pi)) return Float32(fma(Float32(cos(t_2) * sqrt(Float32(Float32(1.0) - Float32(t_1 * t_1)))), xi, Float32(Float32(sin(t_2) * sqrt(Float32(Float32(1.0) - Float32(exp(log1p((Float32(ux * t_0) ^ Float32(2.0)))) - Float32(1.0))))) * yi)) + Float32(Float32(maxCos * Float32(ux - (ux ^ Float32(2.0)))) * zi)) end
\left(\left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \sqrt{1 - \left(\left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\right) \cdot \left(\left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\right)}\right) \cdot xi + \left(\sin \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \sqrt{1 - \left(\left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\right) \cdot \left(\left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\right)}\right) \cdot yi\right) + \left(\left(\left(1 - ux\right) \cdot maxCos\right) \cdot ux\right) \cdot zi
\begin{array}{l}
t_0 := \left(1 - ux\right) \cdot maxCos\\
t_1 := t_0 \cdot ux\\
t_2 := \left(uy \cdot 2\right) \cdot \pi\\
\mathsf{fma}\left(\cos t_2 \cdot \sqrt{1 - t_1 \cdot t_1}, xi, \left(\sin t_2 \cdot \sqrt{1 - \left(e^{\mathsf{log1p}\left({\left(ux \cdot t_0\right)}^{2}\right)} - 1\right)}\right) \cdot yi\right) + \left(maxCos \cdot \left(ux - {ux}^{2}\right)\right) \cdot zi
\end{array}



Bits error versus xi



Bits error versus yi



Bits error versus zi



Bits error versus ux



Bits error versus uy



Bits error versus maxCos
Initial program 0.3
Simplified0.3
Taylor expanded in maxCos around 0 0.3
Applied egg-rr0.3
Final simplification0.3
herbie shell --seed 2022152
(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)))