Average Error: 13.6 → 0.3
Time: 26.7s
Precision: binary32
\[\left(\left(2.328306437 \cdot 10^{-10} \leq ux \land ux \leq 1\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)\]
\[\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \sqrt{1 - \left(\left(1 - ux\right) + ux \cdot maxCos\right) \cdot \left(\left(1 - ux\right) + ux \cdot maxCos\right)} \]
\[\begin{array}{l} t_0 := \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\\ \sqrt[3]{\left(t_0 \cdot \left(t_0 \cdot t_0\right)\right) \cdot {\left(\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({ux}^{2} \cdot {maxCos}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)\right)}^{1.5}} \end{array} \]
\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \sqrt{1 - \left(\left(1 - ux\right) + ux \cdot maxCos\right) \cdot \left(\left(1 - ux\right) + ux \cdot maxCos\right)}
\begin{array}{l}
t_0 := \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\\
\sqrt[3]{\left(t_0 \cdot \left(t_0 \cdot t_0\right)\right) \cdot {\left(\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({ux}^{2} \cdot {maxCos}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)\right)}^{1.5}}
\end{array}
(FPCore (ux uy maxCos)
 :precision binary32
 (*
  (cos (* (* uy 2.0) PI))
  (sqrt
   (- 1.0 (* (+ (- 1.0 ux) (* ux maxCos)) (+ (- 1.0 ux) (* ux maxCos)))))))
(FPCore (ux uy maxCos)
 :precision binary32
 (let* ((t_0 (cos (* (* uy 2.0) PI))))
   (cbrt
    (*
     (* t_0 (* t_0 t_0))
     (pow
      (-
       (+ (* 2.0 (* maxCos (pow ux 2.0))) (* 2.0 ux))
       (+
        (pow ux 2.0)
        (+ (* (pow ux 2.0) (pow maxCos 2.0)) (* 2.0 (* maxCos ux)))))
      1.5)))))
float code(float ux, float uy, float maxCos) {
	return cosf((uy * 2.0f) * ((float) M_PI)) * sqrtf(1.0f - (((1.0f - ux) + (ux * maxCos)) * ((1.0f - ux) + (ux * maxCos))));
}
float code(float ux, float uy, float maxCos) {
	float t_0 = cosf((uy * 2.0f) * ((float) M_PI));
	return cbrtf((t_0 * (t_0 * t_0)) * powf((((2.0f * (maxCos * powf(ux, 2.0f))) + (2.0f * ux)) - (powf(ux, 2.0f) + ((powf(ux, 2.0f) * powf(maxCos, 2.0f)) + (2.0f * (maxCos * ux))))), 1.5f));
}

Error

Bits error versus ux

Bits error versus uy

Bits error versus maxCos

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Derivation

  1. Initial program 13.6

    \[\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \sqrt{1 - \left(\left(1 - ux\right) + ux \cdot maxCos\right) \cdot \left(\left(1 - ux\right) + ux \cdot maxCos\right)} \]
  2. Simplified13.5

    \[\leadsto \color{blue}{\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \sqrt{\mathsf{fma}\left(\mathsf{fma}\left(ux, maxCos, 1 - ux\right), ux - \mathsf{fma}\left(ux, maxCos, 1\right), 1\right)}} \]
  3. Taylor expanded in ux around 0 0.3

    \[\leadsto \cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \sqrt{\color{blue}{\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)}} \]
  4. Applied add-cbrt-cube_binary320.3

    \[\leadsto \cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \color{blue}{\sqrt[3]{\left(\sqrt{\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)} \cdot \sqrt{\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)}\right) \cdot \sqrt{\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)}}} \]
  5. Applied add-cbrt-cube_binary320.3

    \[\leadsto \color{blue}{\sqrt[3]{\left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)}} \cdot \sqrt[3]{\left(\sqrt{\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)} \cdot \sqrt{\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)}\right) \cdot \sqrt{\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)}} \]
  6. Applied cbrt-unprod_binary320.4

    \[\leadsto \color{blue}{\sqrt[3]{\left(\left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot \left(\left(\sqrt{\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)} \cdot \sqrt{\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)}\right) \cdot \sqrt{\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)}\right)}} \]
  7. Applied pow1/2_binary320.4

    \[\leadsto \sqrt[3]{\left(\left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot \left(\left(\sqrt{\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)} \cdot \sqrt{\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)}\right) \cdot \color{blue}{{\left(\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)\right)}^{0.5}}\right)} \]
  8. Applied pow1/2_binary320.4

    \[\leadsto \sqrt[3]{\left(\left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot \left(\left(\sqrt{\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)} \cdot \color{blue}{{\left(\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)\right)}^{0.5}}\right) \cdot {\left(\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)\right)}^{0.5}\right)} \]
  9. Applied pow1/2_binary320.4

    \[\leadsto \sqrt[3]{\left(\left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot \left(\left(\color{blue}{{\left(\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)\right)}^{0.5}} \cdot {\left(\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)\right)}^{0.5}\right) \cdot {\left(\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)\right)}^{0.5}\right)} \]
  10. Applied pow-prod-up_binary320.3

    \[\leadsto \sqrt[3]{\left(\left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot \left(\color{blue}{{\left(\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)\right)}^{\left(0.5 + 0.5\right)}} \cdot {\left(\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)\right)}^{0.5}\right)} \]
  11. Applied pow-prod-up_binary320.3

    \[\leadsto \sqrt[3]{\left(\left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot \color{blue}{{\left(\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)\right)}^{\left(\left(0.5 + 0.5\right) + 0.5\right)}}} \]
  12. Simplified0.3

    \[\leadsto \sqrt[3]{\left(\left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right) \cdot {\left(\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({maxCos}^{2} \cdot {ux}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)\right)}^{\color{blue}{1.5}}} \]
  13. Final simplification0.3

    \[\leadsto \sqrt[3]{\left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \left(\cos \left(\left(uy \cdot 2\right) \cdot \pi\right) \cdot \cos \left(\left(uy \cdot 2\right) \cdot \pi\right)\right)\right) \cdot {\left(\left(2 \cdot \left(maxCos \cdot {ux}^{2}\right) + 2 \cdot ux\right) - \left({ux}^{2} + \left({ux}^{2} \cdot {maxCos}^{2} + 2 \cdot \left(maxCos \cdot ux\right)\right)\right)\right)}^{1.5}} \]

Reproduce

herbie shell --seed 2022067 
(FPCore (ux uy maxCos)
  :name "UniformSampleCone, x"
  :precision binary32
  :pre (and (and (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) (* ux maxCos)) (+ (- 1.0 ux) (* ux maxCos)))))))