Average Error: 0.3 → 0.3
Time: 9.2s
Precision: binary32
\[\left(\left(\left(\left(\left(-10000 \leq xi \land xi \leq 10000\right) \land \left(-10000 \leq yi \land yi \leq 10000\right)\right) \land \left(-10000 \leq zi \land zi \leq 10000\right)\right) \land \left(2.328306437 \cdot 10^{-10} \leq ux \land ux \leq 1\right)\right) \land \left(2.328306437 \cdot 10^{-10} \leq uy \land uy \leq 1\right)\right) \land \left(0 \leq maxCos \land maxCos \leq 1\right)\]
\[\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 \]
\[\mathsf{fma}\left(ux, \left(1 - ux\right) \cdot \left(maxCos \cdot zi\right), \sqrt{\mathsf{fma}\left(1 - ux, \left(ux \cdot \left(maxCos \cdot \left(ux \cdot maxCos\right)\right)\right) \cdot \left(ux + -1\right), 1\right)} \cdot \mathsf{fma}\left(\cos \left(uy \cdot \left(2 \cdot \pi\right)\right), xi, \sin \left(\sqrt[3]{{uy}^{3} \cdot {\left(2 \cdot \pi\right)}^{3}}\right) \cdot yi\right)\right) \]
(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
 (fma
  ux
  (* (- 1.0 ux) (* maxCos zi))
  (*
   (sqrt (fma (- 1.0 ux) (* (* ux (* maxCos (* ux maxCos))) (+ ux -1.0)) 1.0))
   (fma
    (cos (* uy (* 2.0 PI)))
    xi
    (* (sin (cbrt (* (pow uy 3.0) (pow (* 2.0 PI) 3.0)))) yi)))))
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 fmaf(ux, ((1.0f - ux) * (maxCos * zi)), (sqrtf(fmaf((1.0f - ux), ((ux * (maxCos * (ux * maxCos))) * (ux + -1.0f)), 1.0f)) * fmaf(cosf((uy * (2.0f * ((float) M_PI)))), xi, (sinf(cbrtf((powf(uy, 3.0f) * powf((2.0f * ((float) M_PI)), 3.0f)))) * yi))));
}
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)
	return fma(ux, Float32(Float32(Float32(1.0) - ux) * Float32(maxCos * zi)), Float32(sqrt(fma(Float32(Float32(1.0) - ux), Float32(Float32(ux * Float32(maxCos * Float32(ux * maxCos))) * Float32(ux + Float32(-1.0))), Float32(1.0))) * fma(cos(Float32(uy * Float32(Float32(2.0) * Float32(pi)))), xi, Float32(sin(cbrt(Float32((uy ^ Float32(3.0)) * (Float32(Float32(2.0) * Float32(pi)) ^ Float32(3.0))))) * yi))))
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
\mathsf{fma}\left(ux, \left(1 - ux\right) \cdot \left(maxCos \cdot zi\right), \sqrt{\mathsf{fma}\left(1 - ux, \left(ux \cdot \left(maxCos \cdot \left(ux \cdot maxCos\right)\right)\right) \cdot \left(ux + -1\right), 1\right)} \cdot \mathsf{fma}\left(\cos \left(uy \cdot \left(2 \cdot \pi\right)\right), xi, \sin \left(\sqrt[3]{{uy}^{3} \cdot {\left(2 \cdot \pi\right)}^{3}}\right) \cdot yi\right)\right)

Error

Bits error versus xi

Bits error versus yi

Bits error versus zi

Bits error versus ux

Bits error versus uy

Bits error versus maxCos

Derivation

  1. Initial program 0.3

    \[\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 \]
  2. Simplified0.3

    \[\leadsto \color{blue}{\mathsf{fma}\left(ux, \left(1 - ux\right) \cdot \left(maxCos \cdot zi\right), \sqrt{\mathsf{fma}\left(1 - ux, \left(ux \cdot \left(maxCos \cdot \left(ux \cdot maxCos\right)\right)\right) \cdot \left(ux + -1\right), 1\right)} \cdot \mathsf{fma}\left(\cos \left(uy \cdot \left(2 \cdot \pi\right)\right), xi, \sin \left(uy \cdot \left(2 \cdot \pi\right)\right) \cdot yi\right)\right)} \]
  3. Applied egg-rr0.3

    \[\leadsto \mathsf{fma}\left(ux, \left(1 - ux\right) \cdot \left(maxCos \cdot zi\right), \sqrt{\mathsf{fma}\left(1 - ux, \left(ux \cdot \left(maxCos \cdot \left(ux \cdot maxCos\right)\right)\right) \cdot \left(ux + -1\right), 1\right)} \cdot \mathsf{fma}\left(\cos \left(uy \cdot \left(2 \cdot \pi\right)\right), xi, \sin \color{blue}{\left(\sqrt[3]{{uy}^{3} \cdot {\left(2 \cdot \pi\right)}^{3}}\right)} \cdot yi\right)\right) \]
  4. Final simplification0.3

    \[\leadsto \mathsf{fma}\left(ux, \left(1 - ux\right) \cdot \left(maxCos \cdot zi\right), \sqrt{\mathsf{fma}\left(1 - ux, \left(ux \cdot \left(maxCos \cdot \left(ux \cdot maxCos\right)\right)\right) \cdot \left(ux + -1\right), 1\right)} \cdot \mathsf{fma}\left(\cos \left(uy \cdot \left(2 \cdot \pi\right)\right), xi, \sin \left(\sqrt[3]{{uy}^{3} \cdot {\left(2 \cdot \pi\right)}^{3}}\right) \cdot yi\right)\right) \]

Reproduce

herbie shell --seed 2022150 
(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)))