Average Error: 12.4 → 0.7
Time: 39.7s
Precision: binary32
\[0.0001 \leq alphax \land alphax \leq 1 \land 0.0001 \leq alphay \land alphay \leq 1 \land 2.328306437 \cdot 10^{-10} \leq u0 \land u0 \leq 1 \land 0 \leq cos2phi \land cos2phi \leq 1 \land 0 \leq sin2phi\]
\[\frac{-\log \left(1 - u0\right)}{\frac{cos2phi}{alphax \cdot alphax} + \frac{sin2phi}{alphay \cdot alphay}}\]
\[\begin{array}{l} \mathbf{if}\;1 - u0 \leq 0.9553607702255249:\\ \;\;\;\;\frac{-\log \left(1 - u0\right)}{\frac{\sqrt{cos2phi}}{\frac{alphax}{\frac{\sqrt{cos2phi}}{alphax}}} + \frac{sin2phi}{alphay \cdot alphay}}\\ \mathbf{else}:\\ \;\;\;\;\frac{u0 - \left({u0}^{4} \cdot -0.25 - \left(u0 \cdot u0\right) \cdot \left(0.5 + u0 \cdot 0.3333333333333333\right)\right)}{\frac{cos2phi}{alphax \cdot alphax} + \frac{\frac{sin2phi}{alphay}}{alphay}}\\ \end{array}\]
\frac{-\log \left(1 - u0\right)}{\frac{cos2phi}{alphax \cdot alphax} + \frac{sin2phi}{alphay \cdot alphay}}
\begin{array}{l}
\mathbf{if}\;1 - u0 \leq 0.9553607702255249:\\
\;\;\;\;\frac{-\log \left(1 - u0\right)}{\frac{\sqrt{cos2phi}}{\frac{alphax}{\frac{\sqrt{cos2phi}}{alphax}}} + \frac{sin2phi}{alphay \cdot alphay}}\\

\mathbf{else}:\\
\;\;\;\;\frac{u0 - \left({u0}^{4} \cdot -0.25 - \left(u0 \cdot u0\right) \cdot \left(0.5 + u0 \cdot 0.3333333333333333\right)\right)}{\frac{cos2phi}{alphax \cdot alphax} + \frac{\frac{sin2phi}{alphay}}{alphay}}\\

\end{array}
(FPCore (alphax alphay u0 cos2phi sin2phi)
 :precision binary32
 (/
  (- (log (- 1.0 u0)))
  (+ (/ cos2phi (* alphax alphax)) (/ sin2phi (* alphay alphay)))))
(FPCore (alphax alphay u0 cos2phi sin2phi)
 :precision binary32
 (if (<= (- 1.0 u0) 0.9553607702255249)
   (/
    (- (log (- 1.0 u0)))
    (+
     (/ (sqrt cos2phi) (/ alphax (/ (sqrt cos2phi) alphax)))
     (/ sin2phi (* alphay alphay))))
   (/
    (-
     u0
     (-
      (* (pow u0 4.0) -0.25)
      (* (* u0 u0) (+ 0.5 (* u0 0.3333333333333333)))))
    (+ (/ cos2phi (* alphax alphax)) (/ (/ sin2phi alphay) alphay)))))
float code(float alphax, float alphay, float u0, float cos2phi, float sin2phi) {
	return -logf(1.0f - u0) / ((cos2phi / (alphax * alphax)) + (sin2phi / (alphay * alphay)));
}
float code(float alphax, float alphay, float u0, float cos2phi, float sin2phi) {
	float tmp;
	if ((1.0f - u0) <= 0.9553607702255249f) {
		tmp = -logf(1.0f - u0) / ((sqrtf(cos2phi) / (alphax / (sqrtf(cos2phi) / alphax))) + (sin2phi / (alphay * alphay)));
	} else {
		tmp = (u0 - ((powf(u0, 4.0f) * -0.25f) - ((u0 * u0) * (0.5f + (u0 * 0.3333333333333333f))))) / ((cos2phi / (alphax * alphax)) + ((sin2phi / alphay) / alphay));
	}
	return tmp;
}

Error

Bits error versus alphax

Bits error versus alphay

Bits error versus u0

Bits error versus cos2phi

Bits error versus sin2phi

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Derivation

  1. Split input into 2 regimes
  2. if (-.f32 1 u0) < 0.95536077

    1. Initial program 1.7

      \[\frac{-\log \left(1 - u0\right)}{\frac{cos2phi}{alphax \cdot alphax} + \frac{sin2phi}{alphay \cdot alphay}}\]
    2. Using strategy rm
    3. Applied add-sqr-sqrt_binary321.7

      \[\leadsto \frac{-\log \left(1 - u0\right)}{\frac{\color{blue}{\sqrt{cos2phi} \cdot \sqrt{cos2phi}}}{alphax \cdot alphax} + \frac{sin2phi}{alphay \cdot alphay}}\]
    4. Applied associate-/l*_binary321.7

      \[\leadsto \frac{-\log \left(1 - u0\right)}{\color{blue}{\frac{\sqrt{cos2phi}}{\frac{alphax \cdot alphax}{\sqrt{cos2phi}}}} + \frac{sin2phi}{alphay \cdot alphay}}\]
    5. Simplified1.7

      \[\leadsto \frac{-\log \left(1 - u0\right)}{\frac{\sqrt{cos2phi}}{\color{blue}{\frac{alphax}{\frac{\sqrt{cos2phi}}{alphax}}}} + \frac{sin2phi}{alphay \cdot alphay}}\]

    if 0.95536077 < (-.f32 1 u0)

    1. Initial program 14.3

      \[\frac{-\log \left(1 - u0\right)}{\frac{cos2phi}{alphax \cdot alphax} + \frac{sin2phi}{alphay \cdot alphay}}\]
    2. Taylor expanded around 0 0.5

      \[\leadsto \frac{-\color{blue}{\left(-\left(u0 + \left(0.25 \cdot {u0}^{4} + \left(0.5 \cdot {u0}^{2} + 0.3333333333333333 \cdot {u0}^{3}\right)\right)\right)\right)}}{\frac{cos2phi}{alphax \cdot alphax} + \frac{sin2phi}{alphay \cdot alphay}}\]
    3. Simplified0.5

      \[\leadsto \frac{-\color{blue}{\left(\left({u0}^{4} \cdot -0.25 - \left(u0 \cdot u0\right) \cdot \left(0.5 + 0.3333333333333333 \cdot u0\right)\right) - u0\right)}}{\frac{cos2phi}{alphax \cdot alphax} + \frac{sin2phi}{alphay \cdot alphay}}\]
    4. Using strategy rm
    5. Applied associate-/r*_binary320.5

      \[\leadsto \frac{-\left(\left({u0}^{4} \cdot -0.25 - \left(u0 \cdot u0\right) \cdot \left(0.5 + 0.3333333333333333 \cdot u0\right)\right) - u0\right)}{\frac{cos2phi}{alphax \cdot alphax} + \color{blue}{\frac{\frac{sin2phi}{alphay}}{alphay}}}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;1 - u0 \leq 0.9553607702255249:\\ \;\;\;\;\frac{-\log \left(1 - u0\right)}{\frac{\sqrt{cos2phi}}{\frac{alphax}{\frac{\sqrt{cos2phi}}{alphax}}} + \frac{sin2phi}{alphay \cdot alphay}}\\ \mathbf{else}:\\ \;\;\;\;\frac{u0 - \left({u0}^{4} \cdot -0.25 - \left(u0 \cdot u0\right) \cdot \left(0.5 + u0 \cdot 0.3333333333333333\right)\right)}{\frac{cos2phi}{alphax \cdot alphax} + \frac{\frac{sin2phi}{alphay}}{alphay}}\\ \end{array}\]

Reproduce

herbie shell --seed 2021173 
(FPCore (alphax alphay u0 cos2phi sin2phi)
  :name "Beckmann Distribution sample, tan2theta, alphax != alphay, u1 <= 0.5"
  :precision binary32
  :pre (and (<= 0.0001 alphax 1.0) (<= 0.0001 alphay 1.0) (<= 2.328306437e-10 u0 1.0) (<= 0.0 cos2phi 1.0) (<= 0.0 sin2phi))
  (/ (- (log (- 1.0 u0))) (+ (/ cos2phi (* alphax alphax)) (/ sin2phi (* alphay alphay)))))