\sqrt{\left(x \cdot x + y \cdot y\right) + z \cdot z}\begin{array}{l}
\mathbf{if}\;z \le -1.643648655796742516992848026301703974375 \cdot 10^{126}:\\
\;\;\;\;-z\\
\mathbf{elif}\;z \le 5.367114864082888858240124126679124813161 \cdot 10^{82}:\\
\;\;\;\;\sqrt{\mathsf{fma}\left(z, z, \mathsf{fma}\left(y, y, x \cdot x\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;z\\
\end{array}double f(double x, double y, double z) {
double r22023585 = x;
double r22023586 = r22023585 * r22023585;
double r22023587 = y;
double r22023588 = r22023587 * r22023587;
double r22023589 = r22023586 + r22023588;
double r22023590 = z;
double r22023591 = r22023590 * r22023590;
double r22023592 = r22023589 + r22023591;
double r22023593 = sqrt(r22023592);
return r22023593;
}
double f(double x, double y, double z) {
double r22023594 = z;
double r22023595 = -1.6436486557967425e+126;
bool r22023596 = r22023594 <= r22023595;
double r22023597 = -r22023594;
double r22023598 = 5.367114864082889e+82;
bool r22023599 = r22023594 <= r22023598;
double r22023600 = y;
double r22023601 = x;
double r22023602 = r22023601 * r22023601;
double r22023603 = fma(r22023600, r22023600, r22023602);
double r22023604 = fma(r22023594, r22023594, r22023603);
double r22023605 = sqrt(r22023604);
double r22023606 = r22023599 ? r22023605 : r22023594;
double r22023607 = r22023596 ? r22023597 : r22023606;
return r22023607;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 37.3 |
|---|---|
| Target | 25.0 |
| Herbie | 25.2 |
if z < -1.6436486557967425e+126Initial program 58.6
Simplified58.6
Taylor expanded around -inf 15.7
Simplified15.7
if -1.6436486557967425e+126 < z < 5.367114864082889e+82Initial program 28.7
Simplified28.7
if 5.367114864082889e+82 < z Initial program 51.9
Simplified51.9
Taylor expanded around inf 19.9
Final simplification25.2
herbie shell --seed 2019172 +o rules:numerics
(FPCore (x y z)
:name "FRP.Yampa.Vector3:vector3Rho from Yampa-0.10.2"
:herbie-target
(if (< z -6.396479394109776e+136) (- z) (if (< z 7.320293694404182e+117) (sqrt (+ (+ (* z z) (* x x)) (* y y))) z))
(sqrt (+ (+ (* x x) (* y y)) (* z z))))