
(FPCore (sinTheta_O h eta)
:precision binary32
(asin
(/
h
(sqrt
(-
(* eta eta)
(/
(* sinTheta_O sinTheta_O)
(sqrt (- 1.0 (* sinTheta_O sinTheta_O)))))))))
float code(float sinTheta_O, float h, float eta) {
return asinf((h / sqrtf(((eta * eta) - ((sinTheta_O * sinTheta_O) / sqrtf((1.0f - (sinTheta_O * sinTheta_O))))))));
}
real(4) function code(sintheta_o, h, eta)
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: h
real(4), intent (in) :: eta
code = asin((h / sqrt(((eta * eta) - ((sintheta_o * sintheta_o) / sqrt((1.0e0 - (sintheta_o * sintheta_o))))))))
end function
function code(sinTheta_O, h, eta) return asin(Float32(h / sqrt(Float32(Float32(eta * eta) - Float32(Float32(sinTheta_O * sinTheta_O) / sqrt(Float32(Float32(1.0) - Float32(sinTheta_O * sinTheta_O)))))))) end
function tmp = code(sinTheta_O, h, eta) tmp = asin((h / sqrt(((eta * eta) - ((sinTheta_O * sinTheta_O) / sqrt((single(1.0) - (sinTheta_O * sinTheta_O)))))))); end
\begin{array}{l}
\\
\sin^{-1} \left(\frac{h}{\sqrt{eta \cdot eta - \frac{sinTheta_O \cdot sinTheta_O}{\sqrt{1 - sinTheta_O \cdot sinTheta_O}}}}\right)
\end{array}
Sampling outcomes in binary32 precision:
Herbie found 3 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (sinTheta_O h eta)
:precision binary32
(asin
(/
h
(sqrt
(-
(* eta eta)
(/
(* sinTheta_O sinTheta_O)
(sqrt (- 1.0 (* sinTheta_O sinTheta_O)))))))))
float code(float sinTheta_O, float h, float eta) {
return asinf((h / sqrtf(((eta * eta) - ((sinTheta_O * sinTheta_O) / sqrtf((1.0f - (sinTheta_O * sinTheta_O))))))));
}
real(4) function code(sintheta_o, h, eta)
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: h
real(4), intent (in) :: eta
code = asin((h / sqrt(((eta * eta) - ((sintheta_o * sintheta_o) / sqrt((1.0e0 - (sintheta_o * sintheta_o))))))))
end function
function code(sinTheta_O, h, eta) return asin(Float32(h / sqrt(Float32(Float32(eta * eta) - Float32(Float32(sinTheta_O * sinTheta_O) / sqrt(Float32(Float32(1.0) - Float32(sinTheta_O * sinTheta_O)))))))) end
function tmp = code(sinTheta_O, h, eta) tmp = asin((h / sqrt(((eta * eta) - ((sinTheta_O * sinTheta_O) / sqrt((single(1.0) - (sinTheta_O * sinTheta_O)))))))); end
\begin{array}{l}
\\
\sin^{-1} \left(\frac{h}{\sqrt{eta \cdot eta - \frac{sinTheta_O \cdot sinTheta_O}{\sqrt{1 - sinTheta_O \cdot sinTheta_O}}}}\right)
\end{array}
NOTE: sinTheta_O should be positive before calling this function
NOTE: eta should be positive before calling this function
(FPCore (sinTheta_O h eta)
:precision binary32
(asin
(/
h
(sqrt
(-
(* eta eta)
(/
(* sinTheta_O sinTheta_O)
(sqrt (- 1.0 (* sinTheta_O sinTheta_O)))))))))sinTheta_O = abs(sinTheta_O);
eta = abs(eta);
float code(float sinTheta_O, float h, float eta) {
return asinf((h / sqrtf(((eta * eta) - ((sinTheta_O * sinTheta_O) / sqrtf((1.0f - (sinTheta_O * sinTheta_O))))))));
}
NOTE: sinTheta_O should be positive before calling this function
NOTE: eta should be positive before calling this function
real(4) function code(sintheta_o, h, eta)
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: h
real(4), intent (in) :: eta
code = asin((h / sqrt(((eta * eta) - ((sintheta_o * sintheta_o) / sqrt((1.0e0 - (sintheta_o * sintheta_o))))))))
end function
sinTheta_O = abs(sinTheta_O) eta = abs(eta) function code(sinTheta_O, h, eta) return asin(Float32(h / sqrt(Float32(Float32(eta * eta) - Float32(Float32(sinTheta_O * sinTheta_O) / sqrt(Float32(Float32(1.0) - Float32(sinTheta_O * sinTheta_O)))))))) end
sinTheta_O = abs(sinTheta_O) eta = abs(eta) function tmp = code(sinTheta_O, h, eta) tmp = asin((h / sqrt(((eta * eta) - ((sinTheta_O * sinTheta_O) / sqrt((single(1.0) - (sinTheta_O * sinTheta_O)))))))); end
\begin{array}{l}
sinTheta_O = |sinTheta_O|\\
eta = |eta|\\
\\
\sin^{-1} \left(\frac{h}{\sqrt{eta \cdot eta - \frac{sinTheta_O \cdot sinTheta_O}{\sqrt{1 - sinTheta_O \cdot sinTheta_O}}}}\right)
\end{array}
Initial program 92.5%
NOTE: sinTheta_O should be positive before calling this function
NOTE: eta should be positive before calling this function
(FPCore (sinTheta_O h eta)
:precision binary32
(asin
(/
h
(sqrt
(-
(* eta eta)
(*
sinTheta_O
(/ sinTheta_O (sqrt (- 1.0 (* sinTheta_O sinTheta_O))))))))))sinTheta_O = abs(sinTheta_O);
eta = abs(eta);
float code(float sinTheta_O, float h, float eta) {
return asinf((h / sqrtf(((eta * eta) - (sinTheta_O * (sinTheta_O / sqrtf((1.0f - (sinTheta_O * sinTheta_O)))))))));
}
NOTE: sinTheta_O should be positive before calling this function
NOTE: eta should be positive before calling this function
real(4) function code(sintheta_o, h, eta)
real(4), intent (in) :: sintheta_o
real(4), intent (in) :: h
real(4), intent (in) :: eta
code = asin((h / sqrt(((eta * eta) - (sintheta_o * (sintheta_o / sqrt((1.0e0 - (sintheta_o * sintheta_o)))))))))
end function
sinTheta_O = abs(sinTheta_O) eta = abs(eta) function code(sinTheta_O, h, eta) return asin(Float32(h / sqrt(Float32(Float32(eta * eta) - Float32(sinTheta_O * Float32(sinTheta_O / sqrt(Float32(Float32(1.0) - Float32(sinTheta_O * sinTheta_O))))))))) end
sinTheta_O = abs(sinTheta_O) eta = abs(eta) function tmp = code(sinTheta_O, h, eta) tmp = asin((h / sqrt(((eta * eta) - (sinTheta_O * (sinTheta_O / sqrt((single(1.0) - (sinTheta_O * sinTheta_O))))))))); end
\begin{array}{l}
sinTheta_O = |sinTheta_O|\\
eta = |eta|\\
\\
\sin^{-1} \left(\frac{h}{\sqrt{eta \cdot eta - sinTheta_O \cdot \frac{sinTheta_O}{\sqrt{1 - sinTheta_O \cdot sinTheta_O}}}}\right)
\end{array}
Initial program 92.5%
NOTE: sinTheta_O should be positive before calling this function
NOTE: eta should be positive before calling this function
(FPCore (sinTheta_O h eta)
:precision binary32
(asin
(/
h
(sqrt
(fma
sinTheta_O
(/ (- sinTheta_O) (sqrt (- 1.0 (* sinTheta_O sinTheta_O))))
(* eta eta))))))sinTheta_O = abs(sinTheta_O);
eta = abs(eta);
float code(float sinTheta_O, float h, float eta) {
return asinf((h / sqrtf(fmaf(sinTheta_O, (-sinTheta_O / sqrtf((1.0f - (sinTheta_O * sinTheta_O)))), (eta * eta)))));
}
sinTheta_O = abs(sinTheta_O) eta = abs(eta) function code(sinTheta_O, h, eta) return asin(Float32(h / sqrt(fma(sinTheta_O, Float32(Float32(-sinTheta_O) / sqrt(Float32(Float32(1.0) - Float32(sinTheta_O * sinTheta_O)))), Float32(eta * eta))))) end
\begin{array}{l}
sinTheta_O = |sinTheta_O|\\
eta = |eta|\\
\\
\sin^{-1} \left(\frac{h}{\sqrt{\mathsf{fma}\left(sinTheta_O, \frac{-sinTheta_O}{\sqrt{1 - sinTheta_O \cdot sinTheta_O}}, eta \cdot eta\right)}}\right)
\end{array}
Initial program 92.5%
herbie shell --seed 2023276
(FPCore (sinTheta_O h eta)
:name "HairBSDF, gamma for a refracted ray"
:precision binary32
:pre (and (and (and (<= -1.0 sinTheta_O) (<= sinTheta_O 1.0)) (and (<= -1.0 h) (<= h 1.0))) (and (<= 0.0 eta) (<= eta 10.0)))
(asin (/ h (sqrt (- (* eta eta) (/ (* sinTheta_O sinTheta_O) (sqrt (- 1.0 (* sinTheta_O sinTheta_O)))))))))