\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\left(\left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \sqrt{1 - \left(ux \cdot \left(\left(1 - ux\right) \cdot maxCos\right)\right) \cdot \left(ux \cdot \left(\left(1 - ux\right) \cdot maxCos\right)\right)}\right) \cdot xi + \left(\sqrt{1 - \left(ux \cdot \left(\left(1 - ux\right) \cdot maxCos\right)\right) \cdot \left(ux \cdot \left(\left(1 - ux\right) \cdot maxCos\right)\right)} \cdot \sin \left(\sqrt[3]{{\pi}^{2} \cdot {\left(uy \cdot 2\right)}^{3}} \cdot \sqrt[3]{\pi}\right)\right) \cdot yi\right) + \left(ux \cdot \left(\left(1 - ux\right) \cdot maxCos\right)\right) \cdot zi(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
(+
(+
(*
(*
(cos (* (* uy 2.0) PI))
(sqrt
(- 1.0 (* (* ux (* (- 1.0 ux) maxCos)) (* ux (* (- 1.0 ux) maxCos))))))
xi)
(*
(*
(sqrt
(- 1.0 (* (* ux (* (- 1.0 ux) maxCos)) (* ux (* (- 1.0 ux) maxCos)))))
(sin (* (cbrt (* (pow PI 2.0) (pow (* uy 2.0) 3.0))) (cbrt PI))))
yi))
(* (* ux (* (- 1.0 ux) maxCos)) 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) {
return (((cosf((uy * 2.0f) * ((float) M_PI)) * sqrtf(1.0f - ((ux * ((1.0f - ux) * maxCos)) * (ux * ((1.0f - ux) * maxCos))))) * xi) + ((sqrtf(1.0f - ((ux * ((1.0f - ux) * maxCos)) * (ux * ((1.0f - ux) * maxCos)))) * sinf(cbrtf(powf(((float) M_PI), 2.0f) * powf((uy * 2.0f), 3.0f)) * cbrtf((float) M_PI))) * yi)) + ((ux * ((1.0f - ux) * maxCos)) * zi);
}



Bits error versus xi



Bits error versus yi



Bits error versus zi



Bits error versus ux



Bits error versus uy



Bits error versus maxCos
Results
Initial program 0.4
rmApplied add-cube-cbrt_binary320.4
Applied associate-*r*_binary320.5
Simplified0.5
rmApplied add-cbrt-cube_binary320.5
Simplified0.4
Final simplification0.4
herbie shell --seed 2021174
(FPCore (xi yi zi ux uy maxCos)
:name "UniformSampleCone 2"
:precision binary32
:pre (and (<= -10000.0 xi 10000.0) (<= -10000.0 yi 10000.0) (<= -10000.0 zi 10000.0) (<= 2.328306437e-10 ux 1.0) (<= 2.328306437e-10 uy 1.0) (<= 0.0 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)))