1 - \sqrt{0.5 \cdot \left(1 + \frac{1}{\mathsf{hypot}\left(1, x\right)}\right)}\begin{array}{l}
\mathbf{if}\;\mathsf{hypot}\left(1, x\right) \le 1:\\
\;\;\;\;\frac{\mathsf{fma}\left(0.25, \frac{{x}^{2}}{{\left(\sqrt{1}\right)}^{3}}, 0.5 - \mathsf{fma}\left(0.5, \frac{1}{\sqrt{1}}, 0.1875 \cdot \frac{{x}^{4}}{{\left(\sqrt{1}\right)}^{5}}\right)\right)}{1 + \sqrt{0.5 \cdot \left(1 + \frac{1}{\mathsf{hypot}\left(1, x\right)}\right)}}\\
\mathbf{else}:\\
\;\;\;\;\frac{\mathsf{fma}\left(-0.5, 1 + \frac{1}{\mathsf{hypot}\left(1, x\right)}, 1 \cdot 1\right)}{\sqrt{1 + \sqrt{0.5 \cdot \left(1 + \frac{1}{\mathsf{hypot}\left(1, x\right)}\right)}}} \cdot \frac{1}{\sqrt{1 + \sqrt{0.5 \cdot \left(1 + \frac{1}{\mathsf{hypot}\left(1, x\right)}\right)}}}\\
\end{array}double f(double x) {
double r358109 = 1.0;
double r358110 = 0.5;
double r358111 = x;
double r358112 = hypot(r358109, r358111);
double r358113 = r358109 / r358112;
double r358114 = r358109 + r358113;
double r358115 = r358110 * r358114;
double r358116 = sqrt(r358115);
double r358117 = r358109 - r358116;
return r358117;
}
double f(double x) {
double r358118 = 1.0;
double r358119 = x;
double r358120 = hypot(r358118, r358119);
bool r358121 = r358120 <= r358118;
double r358122 = 0.25;
double r358123 = 2.0;
double r358124 = pow(r358119, r358123);
double r358125 = sqrt(r358118);
double r358126 = 3.0;
double r358127 = pow(r358125, r358126);
double r358128 = r358124 / r358127;
double r358129 = 0.5;
double r358130 = 1.0;
double r358131 = r358130 / r358125;
double r358132 = 0.1875;
double r358133 = 4.0;
double r358134 = pow(r358119, r358133);
double r358135 = 5.0;
double r358136 = pow(r358125, r358135);
double r358137 = r358134 / r358136;
double r358138 = r358132 * r358137;
double r358139 = fma(r358129, r358131, r358138);
double r358140 = r358129 - r358139;
double r358141 = fma(r358122, r358128, r358140);
double r358142 = r358118 / r358120;
double r358143 = r358118 + r358142;
double r358144 = r358129 * r358143;
double r358145 = sqrt(r358144);
double r358146 = r358118 + r358145;
double r358147 = r358141 / r358146;
double r358148 = -r358129;
double r358149 = r358118 * r358118;
double r358150 = fma(r358148, r358143, r358149);
double r358151 = sqrt(r358146);
double r358152 = r358150 / r358151;
double r358153 = r358130 / r358151;
double r358154 = r358152 * r358153;
double r358155 = r358121 ? r358147 : r358154;
return r358155;
}



Bits error versus x
if (hypot 1.0 x) < 1.0Initial program 30.2
rmApplied flip--30.2
Simplified30.2
Taylor expanded around 0 30.2
Simplified0.0
if 1.0 < (hypot 1.0 x) Initial program 1.5
rmApplied flip--1.5
Simplified0.5
rmApplied div-inv0.5
rmApplied add-sqr-sqrt1.5
Applied *-un-lft-identity1.5
Applied times-frac0.5
Applied associate-*r*0.5
Simplified0.5
Final simplification0.3
herbie shell --seed 2020062 +o rules:numerics
(FPCore (x)
:name "Given's Rotation SVD example, simplified"
:precision binary64
(- 1 (sqrt (* 0.5 (+ 1 (/ 1 (hypot 1 x)))))))