Average Error: 0.5 → 0.1
Time: 2.4min
Precision: binary64
Cost: 164100
\[\left(\left(\left(2.328306437 \cdot 10^{-10} \leq u0 \land u0 \leq 1\right) \land \left(2.328306437 \cdot 10^{-10} \leq u1 \land u1 \leq 0.5\right)\right) \land \left(0.0001 \leq alphax \land alphax \leq 1\right)\right) \land \left(0.0001 \leq alphay \land alphay \leq 1\right)\]
\[\frac{1}{\sqrt{1 + \frac{\frac{1}{\frac{\cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right) \cdot \cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right)}{alphax \cdot alphax} + \frac{\sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right) \cdot \sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right)}{alphay \cdot alphay}} \cdot u0}{1 - u0}}} \]
\[\begin{array}{l} t_0 := \tan^{-1} \left(\frac{-\frac{alphay}{alphax}}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)\\ t_1 := 1 + \frac{\frac{u0}{1 - u0}}{{\left(\frac{\cos t_0}{alphax}\right)}^{2} + {\left(\frac{\sin t_0}{alphay}\right)}^{2}}\\ \mathbf{if}\;t_1 \ne 0:\\ \;\;\;\;{t_1}^{-0.5}\\ \mathbf{else}:\\ \;\;\;\;1\\ \end{array} \]
(FPCore (u0 u1 alphax alphay)
 :precision binary64
 (/
  1.0
  (sqrt
   (+
    1.0
    (/
     (*
      (/
       1.0
       (+
        (/
         (*
          (cos
           (atan (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI))))))
          (cos
           (atan
            (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI)))))))
         (* alphax alphax))
        (/
         (*
          (sin
           (atan (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI))))))
          (sin
           (atan
            (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI)))))))
         (* alphay alphay))))
      u0)
     (- 1.0 u0))))))
(FPCore (u0 u1 alphax alphay)
 :precision binary64
 (let* ((t_0 (atan (/ (- (/ alphay alphax)) (tan (* (+ PI PI) u1)))))
        (t_1
         (+
          1.0
          (/
           (/ u0 (- 1.0 u0))
           (+
            (pow (/ (cos t_0) alphax) 2.0)
            (pow (/ (sin t_0) alphay) 2.0))))))
   (if (!= t_1 0.0) (pow t_1 -0.5) 1.0)))
double code(double u0, double u1, double alphax, double alphay) {
	return 1.0 / sqrt((1.0 + (((1.0 / (((cos(atan(((alphay / alphax) * tan((((2.0 * ((double) M_PI)) * u1) + (0.5 * ((double) M_PI))))))) * cos(atan(((alphay / alphax) * tan((((2.0 * ((double) M_PI)) * u1) + (0.5 * ((double) M_PI)))))))) / (alphax * alphax)) + ((sin(atan(((alphay / alphax) * tan((((2.0 * ((double) M_PI)) * u1) + (0.5 * ((double) M_PI))))))) * sin(atan(((alphay / alphax) * tan((((2.0 * ((double) M_PI)) * u1) + (0.5 * ((double) M_PI)))))))) / (alphay * alphay)))) * u0) / (1.0 - u0))));
}
double code(double u0, double u1, double alphax, double alphay) {
	double t_0 = atan((-(alphay / alphax) / tan(((((double) M_PI) + ((double) M_PI)) * u1))));
	double t_1 = 1.0 + ((u0 / (1.0 - u0)) / (pow((cos(t_0) / alphax), 2.0) + pow((sin(t_0) / alphay), 2.0)));
	double tmp;
	if (t_1 != 0.0) {
		tmp = pow(t_1, -0.5);
	} else {
		tmp = 1.0;
	}
	return tmp;
}
public static double code(double u0, double u1, double alphax, double alphay) {
	return 1.0 / Math.sqrt((1.0 + (((1.0 / (((Math.cos(Math.atan(((alphay / alphax) * Math.tan((((2.0 * Math.PI) * u1) + (0.5 * Math.PI)))))) * Math.cos(Math.atan(((alphay / alphax) * Math.tan((((2.0 * Math.PI) * u1) + (0.5 * Math.PI))))))) / (alphax * alphax)) + ((Math.sin(Math.atan(((alphay / alphax) * Math.tan((((2.0 * Math.PI) * u1) + (0.5 * Math.PI)))))) * Math.sin(Math.atan(((alphay / alphax) * Math.tan((((2.0 * Math.PI) * u1) + (0.5 * Math.PI))))))) / (alphay * alphay)))) * u0) / (1.0 - u0))));
}
public static double code(double u0, double u1, double alphax, double alphay) {
	double t_0 = Math.atan((-(alphay / alphax) / Math.tan(((Math.PI + Math.PI) * u1))));
	double t_1 = 1.0 + ((u0 / (1.0 - u0)) / (Math.pow((Math.cos(t_0) / alphax), 2.0) + Math.pow((Math.sin(t_0) / alphay), 2.0)));
	double tmp;
	if (t_1 != 0.0) {
		tmp = Math.pow(t_1, -0.5);
	} else {
		tmp = 1.0;
	}
	return tmp;
}
def code(u0, u1, alphax, alphay):
	return 1.0 / math.sqrt((1.0 + (((1.0 / (((math.cos(math.atan(((alphay / alphax) * math.tan((((2.0 * math.pi) * u1) + (0.5 * math.pi)))))) * math.cos(math.atan(((alphay / alphax) * math.tan((((2.0 * math.pi) * u1) + (0.5 * math.pi))))))) / (alphax * alphax)) + ((math.sin(math.atan(((alphay / alphax) * math.tan((((2.0 * math.pi) * u1) + (0.5 * math.pi)))))) * math.sin(math.atan(((alphay / alphax) * math.tan((((2.0 * math.pi) * u1) + (0.5 * math.pi))))))) / (alphay * alphay)))) * u0) / (1.0 - u0))))
def code(u0, u1, alphax, alphay):
	t_0 = math.atan((-(alphay / alphax) / math.tan(((math.pi + math.pi) * u1))))
	t_1 = 1.0 + ((u0 / (1.0 - u0)) / (math.pow((math.cos(t_0) / alphax), 2.0) + math.pow((math.sin(t_0) / alphay), 2.0)))
	tmp = 0
	if t_1 != 0.0:
		tmp = math.pow(t_1, -0.5)
	else:
		tmp = 1.0
	return tmp
function code(u0, u1, alphax, alphay)
	return Float64(1.0 / sqrt(Float64(1.0 + Float64(Float64(Float64(1.0 / Float64(Float64(Float64(cos(atan(Float64(Float64(alphay / alphax) * tan(Float64(Float64(Float64(2.0 * pi) * u1) + Float64(0.5 * pi)))))) * cos(atan(Float64(Float64(alphay / alphax) * tan(Float64(Float64(Float64(2.0 * pi) * u1) + Float64(0.5 * pi))))))) / Float64(alphax * alphax)) + Float64(Float64(sin(atan(Float64(Float64(alphay / alphax) * tan(Float64(Float64(Float64(2.0 * pi) * u1) + Float64(0.5 * pi)))))) * sin(atan(Float64(Float64(alphay / alphax) * tan(Float64(Float64(Float64(2.0 * pi) * u1) + Float64(0.5 * pi))))))) / Float64(alphay * alphay)))) * u0) / Float64(1.0 - u0)))))
end
function code(u0, u1, alphax, alphay)
	t_0 = atan(Float64(Float64(-Float64(alphay / alphax)) / tan(Float64(Float64(pi + pi) * u1))))
	t_1 = Float64(1.0 + Float64(Float64(u0 / Float64(1.0 - u0)) / Float64((Float64(cos(t_0) / alphax) ^ 2.0) + (Float64(sin(t_0) / alphay) ^ 2.0))))
	tmp = 0.0
	if (t_1 != 0.0)
		tmp = t_1 ^ -0.5;
	else
		tmp = 1.0;
	end
	return tmp
end
function tmp = code(u0, u1, alphax, alphay)
	tmp = 1.0 / sqrt((1.0 + (((1.0 / (((cos(atan(((alphay / alphax) * tan((((2.0 * pi) * u1) + (0.5 * pi)))))) * cos(atan(((alphay / alphax) * tan((((2.0 * pi) * u1) + (0.5 * pi))))))) / (alphax * alphax)) + ((sin(atan(((alphay / alphax) * tan((((2.0 * pi) * u1) + (0.5 * pi)))))) * sin(atan(((alphay / alphax) * tan((((2.0 * pi) * u1) + (0.5 * pi))))))) / (alphay * alphay)))) * u0) / (1.0 - u0))));
end
function tmp_2 = code(u0, u1, alphax, alphay)
	t_0 = atan((-(alphay / alphax) / tan(((pi + pi) * u1))));
	t_1 = 1.0 + ((u0 / (1.0 - u0)) / (((cos(t_0) / alphax) ^ 2.0) + ((sin(t_0) / alphay) ^ 2.0)));
	tmp = 0.0;
	if (t_1 ~= 0.0)
		tmp = t_1 ^ -0.5;
	else
		tmp = 1.0;
	end
	tmp_2 = tmp;
end
code[u0_, u1_, alphax_, alphay_] := N[(1.0 / N[Sqrt[N[(1.0 + N[(N[(N[(1.0 / N[(N[(N[(N[Cos[N[ArcTan[N[(N[(alphay / alphax), $MachinePrecision] * N[Tan[N[(N[(N[(2.0 * Pi), $MachinePrecision] * u1), $MachinePrecision] + N[(0.5 * Pi), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision] * N[Cos[N[ArcTan[N[(N[(alphay / alphax), $MachinePrecision] * N[Tan[N[(N[(N[(2.0 * Pi), $MachinePrecision] * u1), $MachinePrecision] + N[(0.5 * Pi), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]), $MachinePrecision] / N[(alphax * alphax), $MachinePrecision]), $MachinePrecision] + N[(N[(N[Sin[N[ArcTan[N[(N[(alphay / alphax), $MachinePrecision] * N[Tan[N[(N[(N[(2.0 * Pi), $MachinePrecision] * u1), $MachinePrecision] + N[(0.5 * Pi), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision] * N[Sin[N[ArcTan[N[(N[(alphay / alphax), $MachinePrecision] * N[Tan[N[(N[(N[(2.0 * Pi), $MachinePrecision] * u1), $MachinePrecision] + N[(0.5 * Pi), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]], $MachinePrecision]), $MachinePrecision] / N[(alphay * alphay), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * u0), $MachinePrecision] / N[(1.0 - u0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
code[u0_, u1_, alphax_, alphay_] := Block[{t$95$0 = N[ArcTan[N[((-N[(alphay / alphax), $MachinePrecision]) / N[Tan[N[(N[(Pi + Pi), $MachinePrecision] * u1), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]}, Block[{t$95$1 = N[(1.0 + N[(N[(u0 / N[(1.0 - u0), $MachinePrecision]), $MachinePrecision] / N[(N[Power[N[(N[Cos[t$95$0], $MachinePrecision] / alphax), $MachinePrecision], 2.0], $MachinePrecision] + N[Power[N[(N[Sin[t$95$0], $MachinePrecision] / alphay), $MachinePrecision], 2.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, If[Unequal[t$95$1, 0.0], N[Power[t$95$1, -0.5], $MachinePrecision], 1.0]]]
\frac{1}{\sqrt{1 + \frac{\frac{1}{\frac{\cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right) \cdot \cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right)}{alphax \cdot alphax} + \frac{\sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right) \cdot \sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right)}{alphay \cdot alphay}} \cdot u0}{1 - u0}}}
\begin{array}{l}
t_0 := \tan^{-1} \left(\frac{-\frac{alphay}{alphax}}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)\\
t_1 := 1 + \frac{\frac{u0}{1 - u0}}{{\left(\frac{\cos t_0}{alphax}\right)}^{2} + {\left(\frac{\sin t_0}{alphay}\right)}^{2}}\\
\mathbf{if}\;t_1 \ne 0:\\
\;\;\;\;{t_1}^{-0.5}\\

\mathbf{else}:\\
\;\;\;\;1\\


\end{array}

Error

Derivation

  1. Initial program 0.5

    \[\frac{1}{\sqrt{1 + \frac{\frac{1}{\frac{\cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right) \cdot \cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right)}{alphax \cdot alphax} + \frac{\sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right) \cdot \sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\left(2 \cdot \pi\right) \cdot u1 + 0.5 \cdot \pi\right)\right)}{alphay \cdot alphay}} \cdot u0}{1 - u0}}} \]
  2. Simplified0.5

    \[\leadsto \color{blue}{\frac{1}{\sqrt{1 + \frac{u0}{\left(1 - u0\right) \cdot \left({\left(\frac{\cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\mathsf{fma}\left(2 \cdot \pi, u1, 0.5 \cdot \pi\right)\right)\right)}{alphax}\right)}^{2} + {\left(\frac{\sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \tan \left(\mathsf{fma}\left(2 \cdot \pi, u1, 0.5 \cdot \pi\right)\right)\right)}{alphay}\right)}^{2}\right)}}}} \]
    Proof
  3. Applied egg-rr0.1

    \[\leadsto \color{blue}{\begin{array}{l} \color{blue}{\mathbf{if}\;1 + \frac{\frac{u0}{1 - u0}}{{\left(\frac{\cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \frac{-1}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphax}\right)}^{2} + {\left(\frac{\sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \frac{-1}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphay}\right)}^{2}} \ne 0:\\ \;\;\;\;{\left(1 + \frac{\frac{u0}{1 - u0}}{{\left(\frac{\cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \frac{-1}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphax}\right)}^{2} + {\left(\frac{\sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \frac{-1}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphay}\right)}^{2}}\right)}^{-0.5}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{\sqrt{1 + \frac{\frac{u0}{1 - u0}}{{\left(\frac{\cos \tan^{-1} \left(\frac{alphay}{alphax} \cdot \frac{-1}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphax}\right)}^{2} + {\left(\frac{\sin \tan^{-1} \left(\frac{alphay}{alphax} \cdot \frac{-1}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphay}\right)}^{2}}}}\\ } \end{array}} \]
  4. Simplified0.1

    \[\leadsto \color{blue}{\begin{array}{l} \color{blue}{\mathbf{if}\;1 + \frac{\frac{u0}{1 - u0}}{{\left(\frac{\cos \tan^{-1} \left(\frac{-\frac{alphay}{alphax}}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphax}\right)}^{2} + {\left(\frac{\sin \tan^{-1} \left(\frac{-\frac{alphay}{alphax}}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphay}\right)}^{2}} \ne 0:\\ \;\;\;\;{\left(1 + \frac{\frac{u0}{1 - u0}}{{\left(\frac{\cos \tan^{-1} \left(\frac{-\frac{alphay}{alphax}}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphax}\right)}^{2} + {\left(\frac{\sin \tan^{-1} \left(\frac{-\frac{alphay}{alphax}}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphay}\right)}^{2}}\right)}^{-0.5}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{\sqrt{1 + \frac{\frac{u0}{1 - u0}}{{\left(\frac{\cos \tan^{-1} \left(\frac{-\frac{alphay}{alphax}}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphax}\right)}^{2} + {\left(\frac{\sin \tan^{-1} \left(\frac{-\frac{alphay}{alphax}}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphay}\right)}^{2}}}}\\ } \end{array}} \]
    Proof
  5. Taylor expanded in u0 around 0 0.1

    \[\leadsto \begin{array}{l} \mathbf{if}\;1 + \frac{\frac{u0}{1 - u0}}{{\left(\frac{\cos \tan^{-1} \left(\frac{-\frac{alphay}{alphax}}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphax}\right)}^{2} + {\left(\frac{\sin \tan^{-1} \left(\frac{-\frac{alphay}{alphax}}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphay}\right)}^{2}} \ne 0:\\ \;\;\;\;{\left(1 + \frac{\frac{u0}{1 - u0}}{{\left(\frac{\cos \tan^{-1} \left(\frac{-\frac{alphay}{alphax}}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphax}\right)}^{2} + {\left(\frac{\sin \tan^{-1} \left(\frac{-\frac{alphay}{alphax}}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)}{alphay}\right)}^{2}}\right)}^{-0.5}\\ \mathbf{else}:\\ \;\;\;\;1\\ \end{array} \]

Alternatives

Alternative 1
Error0.5
Cost85312
\[\begin{array}{l} t_0 := \tan^{-1} \left(\frac{-\frac{alphay}{alphax}}{\tan \left(\left(\pi + \pi\right) \cdot u1\right)}\right)\\ \frac{1}{\sqrt{1 + \frac{\frac{u0}{1 - u0}}{{\left(\frac{\cos t_0}{alphax}\right)}^{2} + {\left(\frac{\sin t_0}{alphay}\right)}^{2}}}} \end{array} \]
Alternative 2
Error23.9
Cost64
\[1 \]

Error

Reproduce

herbie shell --seed 2023010 
(FPCore (u0 u1 alphax alphay)
  :name "Trowbridge-Reitz Sample, sample surface normal, cosTheta"
  :precision binary64
  :pre (and (and (and (and (<= 2.328306437e-10 u0) (<= u0 1.0)) (and (<= 2.328306437e-10 u1) (<= u1 0.5))) (and (<= 0.0001 alphax) (<= alphax 1.0))) (and (<= 0.0001 alphay) (<= alphay 1.0)))
  (/ 1.0 (sqrt (+ 1.0 (/ (* (/ 1.0 (+ (/ (* (cos (atan (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI)))))) (cos (atan (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI))))))) (* alphax alphax)) (/ (* (sin (atan (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI)))))) (sin (atan (* (/ alphay alphax) (tan (+ (* (* 2.0 PI) u1) (* 0.5 PI))))))) (* alphay alphay)))) u0) (- 1.0 u0))))))