\sqrt{\frac{\left(x \cdot x + y \cdot y\right) + z \cdot z}{3}}\begin{array}{l}
\mathbf{if}\;x \leq -9.222615287767356 \cdot 10^{+137}:\\
\;\;\;\;-\sqrt{\sqrt{0.3333333333333333}} \cdot \left(x \cdot \sqrt{\sqrt{0.3333333333333333}}\right)\\
\mathbf{elif}\;x \leq -4.367848642812645 \cdot 10^{-61}:\\
\;\;\;\;\sqrt{\frac{\left(x \cdot x + y \cdot y\right) + z \cdot z}{3}}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{0.3333333333333333} \cdot z\\
\end{array}(FPCore (x y z) :precision binary64 (sqrt (/ (+ (+ (* x x) (* y y)) (* z z)) 3.0)))
(FPCore (x y z)
:precision binary64
(if (<= x -9.222615287767356e+137)
(-
(*
(sqrt (sqrt 0.3333333333333333))
(* x (sqrt (sqrt 0.3333333333333333)))))
(if (<= x -4.367848642812645e-61)
(sqrt (/ (+ (+ (* x x) (* y y)) (* z z)) 3.0))
(* (sqrt 0.3333333333333333) z))))double code(double x, double y, double z) {
return sqrt((((x * x) + (y * y)) + (z * z)) / 3.0);
}
double code(double x, double y, double z) {
double tmp;
if (x <= -9.222615287767356e+137) {
tmp = -(sqrt(sqrt(0.3333333333333333)) * (x * sqrt(sqrt(0.3333333333333333))));
} else if (x <= -4.367848642812645e-61) {
tmp = sqrt((((x * x) + (y * y)) + (z * z)) / 3.0);
} else {
tmp = sqrt(0.3333333333333333) * z;
}
return tmp;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 38.1 |
|---|---|
| Target | 19.9 |
| Herbie | 10.9 |
if x < -9.2226152877673558e137Initial program 60.4
Taylor expanded around -inf 9.0
Simplified9.0
rmApplied add-sqr-sqrt_binary64_202199.0
Applied associate-*l*_binary64_201388.9
Simplified8.9
if -9.2226152877673558e137 < x < -4.36784864281264515e-61Initial program 18.4
if -4.36784864281264515e-61 < x Initial program 31.4
Taylor expanded around inf 6.9
Final simplification10.9
herbie shell --seed 2021044
(FPCore (x y z)
:name "Data.Array.Repa.Algorithms.Pixel:doubleRmsOfRGB8 from repa-algorithms-3.4.0.1"
:precision binary64
:herbie-target
(if (< z -6.396479394109776e+136) (/ (- z) (sqrt 3.0)) (if (< z 7.320293694404182e+117) (/ (sqrt (+ (+ (* z z) (* x x)) (* y y))) (sqrt 3.0)) (* (sqrt 0.3333333333333333) z)))
(sqrt (/ (+ (+ (* x x) (* y y)) (* z z)) 3.0)))