\sqrt{\frac{\left(x \cdot x + y \cdot y\right) + z \cdot z}{3}}\begin{array}{l}
\mathbf{if}\;y \cdot y \le 4.940656458412465441765687928682213723651 \cdot 10^{-324}:\\
\;\;\;\;\left|-\frac{z}{\sqrt{3}}\right|\\
\mathbf{elif}\;y \cdot y \le 2.796727373188044154649432399903811497242 \cdot 10^{-15}:\\
\;\;\;\;\sqrt{\mathsf{fma}\left(z, z, \mathsf{fma}\left(x, x, y \cdot y\right)\right)} \cdot \sqrt{\frac{1}{3}}\\
\mathbf{elif}\;y \cdot y \le 3837990851.153699398040771484375:\\
\;\;\;\;\left|-\frac{z}{\sqrt{3}}\right|\\
\mathbf{elif}\;y \cdot y \le 1.10478303491952550487979066013675689444 \cdot 10^{208}:\\
\;\;\;\;\sqrt{\mathsf{fma}\left(z, z, \mathsf{fma}\left(x, x, y \cdot y\right)\right)} \cdot \sqrt{\frac{1}{3}}\\
\mathbf{else}:\\
\;\;\;\;\left|\frac{y}{\sqrt{3}}\right|\\
\end{array}double f(double x, double y, double z) {
double r560637 = x;
double r560638 = r560637 * r560637;
double r560639 = y;
double r560640 = r560639 * r560639;
double r560641 = r560638 + r560640;
double r560642 = z;
double r560643 = r560642 * r560642;
double r560644 = r560641 + r560643;
double r560645 = 3.0;
double r560646 = r560644 / r560645;
double r560647 = sqrt(r560646);
return r560647;
}
double f(double x, double y, double z) {
double r560648 = y;
double r560649 = r560648 * r560648;
double r560650 = 4.9406564584125e-324;
bool r560651 = r560649 <= r560650;
double r560652 = z;
double r560653 = 3.0;
double r560654 = sqrt(r560653);
double r560655 = r560652 / r560654;
double r560656 = -r560655;
double r560657 = fabs(r560656);
double r560658 = 2.796727373188044e-15;
bool r560659 = r560649 <= r560658;
double r560660 = x;
double r560661 = fma(r560660, r560660, r560649);
double r560662 = fma(r560652, r560652, r560661);
double r560663 = sqrt(r560662);
double r560664 = 1.0;
double r560665 = r560664 / r560653;
double r560666 = sqrt(r560665);
double r560667 = r560663 * r560666;
double r560668 = 3837990851.1536994;
bool r560669 = r560649 <= r560668;
double r560670 = 1.1047830349195255e+208;
bool r560671 = r560649 <= r560670;
double r560672 = r560648 / r560654;
double r560673 = fabs(r560672);
double r560674 = r560671 ? r560667 : r560673;
double r560675 = r560669 ? r560657 : r560674;
double r560676 = r560659 ? r560667 : r560675;
double r560677 = r560651 ? r560657 : r560676;
return r560677;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 37.7 |
|---|---|
| Target | 25.6 |
| Herbie | 25.3 |
if (* y y) < 4.9406564584125e-324 or 2.796727373188044e-15 < (* y y) < 3837990851.1536994Initial program 30.7
Simplified30.7
rmApplied add-sqr-sqrt30.9
Applied add-sqr-sqrt30.9
Applied times-frac30.9
Applied rem-sqrt-square30.8
Taylor expanded around -inf 31.3
Simplified31.3
if 4.9406564584125e-324 < (* y y) < 2.796727373188044e-15 or 3837990851.1536994 < (* y y) < 1.1047830349195255e+208Initial program 27.5
Simplified27.5
rmApplied div-inv27.5
Applied sqrt-prod27.6
if 1.1047830349195255e+208 < (* y y) Initial program 55.4
Simplified55.4
rmApplied add-sqr-sqrt55.4
Applied add-sqr-sqrt55.4
Applied times-frac55.4
Applied rem-sqrt-square55.4
Taylor expanded around 0 18.1
Final simplification25.3
herbie shell --seed 2019235 +o rules:numerics
(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.3964793941097758e136) (/ (- z) (sqrt 3)) (if (< z 7.3202936944041821e117) (/ (sqrt (+ (+ (* z z) (* x x)) (* y y))) (sqrt 3)) (* (sqrt 0.333333333333333315) z)))
(sqrt (/ (+ (+ (* x x) (* y y)) (* z z)) 3)))