(FPCore (u1 u2) :precision binary64 (+ (* (* (/ 1.0 6.0) (pow (* -2.0 (log u1)) 0.5)) (cos (* (* 2.0 PI) u2))) 0.5))
(FPCore (u1 u2) :precision binary64 (fma (sqrt (- (log u1))) (* 0.16666666666666666 (* (sqrt 2.0) (cos (* 2.0 (* u2 PI))))) 0.5))
double code(double u1, double u2) {
return (((1.0 / 6.0) * pow((-2.0 * log(u1)), 0.5)) * cos(((2.0 * ((double) M_PI)) * u2))) + 0.5;
}
double code(double u1, double u2) {
return fma(sqrt(-log(u1)), (0.16666666666666666 * (sqrt(2.0) * cos((2.0 * (u2 * ((double) M_PI)))))), 0.5);
}
function code(u1, u2) return Float64(Float64(Float64(Float64(1.0 / 6.0) * (Float64(-2.0 * log(u1)) ^ 0.5)) * cos(Float64(Float64(2.0 * pi) * u2))) + 0.5) end
function code(u1, u2) return fma(sqrt(Float64(-log(u1))), Float64(0.16666666666666666 * Float64(sqrt(2.0) * cos(Float64(2.0 * Float64(u2 * pi))))), 0.5) end
code[u1_, u2_] := N[(N[(N[(N[(1.0 / 6.0), $MachinePrecision] * N[Power[N[(-2.0 * N[Log[u1], $MachinePrecision]), $MachinePrecision], 0.5], $MachinePrecision]), $MachinePrecision] * N[Cos[N[(N[(2.0 * Pi), $MachinePrecision] * u2), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] + 0.5), $MachinePrecision]
code[u1_, u2_] := N[(N[Sqrt[(-N[Log[u1], $MachinePrecision])], $MachinePrecision] * N[(0.16666666666666666 * N[(N[Sqrt[2.0], $MachinePrecision] * N[Cos[N[(2.0 * N[(u2 * Pi), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + 0.5), $MachinePrecision]
\left(\frac{1}{6} \cdot {\left(-2 \cdot \log u1\right)}^{0.5}\right) \cdot \cos \left(\left(2 \cdot \pi\right) \cdot u2\right) + 0.5
\mathsf{fma}\left(\sqrt{-\log u1}, 0.16666666666666666 \cdot \left(\sqrt{2} \cdot \cos \left(2 \cdot \left(u2 \cdot \pi\right)\right)\right), 0.5\right)



Bits error versus u1



Bits error versus u2
Initial program 0.4
Simplified0.4
Taylor expanded in u1 around inf 0.3
Simplified0.3
Taylor expanded in u1 around 0 0.3
Simplified0.2
Final simplification0.2
herbie shell --seed 2022152
(FPCore (u1 u2)
:name "normal distribution"
:precision binary64
:pre (and (and (<= 0.0 u1) (<= u1 1.0)) (and (<= 0.0 u2) (<= u2 1.0)))
(+ (* (* (/ 1.0 6.0) (pow (* -2.0 (log u1)) 0.5)) (cos (* (* 2.0 PI) u2))) 0.5))