x + \frac{\left(y - z\right) \cdot \left(t - x\right)}{a - z}\begin{array}{l}
\mathbf{if}\;z \le -2.144165143768362991760089872609493676713 \cdot 10^{186} \lor \neg \left(z \le 2.076744265404525669788852177351907204291 \cdot 10^{154}\right):\\
\;\;\;\;\mathsf{fma}\left(y, \frac{x}{z} - \frac{t}{z}, t\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{y - z}{a - z}, t - x, x\right)\\
\end{array}double f(double x, double y, double z, double t, double a) {
double r611180 = x;
double r611181 = y;
double r611182 = z;
double r611183 = r611181 - r611182;
double r611184 = t;
double r611185 = r611184 - r611180;
double r611186 = r611183 * r611185;
double r611187 = a;
double r611188 = r611187 - r611182;
double r611189 = r611186 / r611188;
double r611190 = r611180 + r611189;
return r611190;
}
double f(double x, double y, double z, double t, double a) {
double r611191 = z;
double r611192 = -2.144165143768363e+186;
bool r611193 = r611191 <= r611192;
double r611194 = 2.0767442654045257e+154;
bool r611195 = r611191 <= r611194;
double r611196 = !r611195;
bool r611197 = r611193 || r611196;
double r611198 = y;
double r611199 = x;
double r611200 = r611199 / r611191;
double r611201 = t;
double r611202 = r611201 / r611191;
double r611203 = r611200 - r611202;
double r611204 = fma(r611198, r611203, r611201);
double r611205 = r611198 - r611191;
double r611206 = a;
double r611207 = r611206 - r611191;
double r611208 = r611205 / r611207;
double r611209 = r611201 - r611199;
double r611210 = fma(r611208, r611209, r611199);
double r611211 = r611197 ? r611204 : r611210;
return r611211;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t




Bits error versus a
| Original | 24.4 |
|---|---|
| Target | 11.9 |
| Herbie | 10.0 |
if z < -2.144165143768363e+186 or 2.0767442654045257e+154 < z Initial program 48.0
Simplified22.9
Taylor expanded around inf 25.6
Simplified16.4
if -2.144165143768363e+186 < z < 2.0767442654045257e+154Initial program 16.7
Simplified7.9
rmApplied div-inv8.0
rmApplied un-div-inv7.9
Final simplification10.0
herbie shell --seed 2020001 +o rules:numerics
(FPCore (x y z t a)
:name "Graphics.Rendering.Chart.Axis.Types:invLinMap from Chart-1.5.3"
:precision binary64
:herbie-target
(if (< z -1.2536131056095036e+188) (- t (* (/ y z) (- t x))) (if (< z 4.446702369113811e+64) (+ x (/ (- y z) (/ (- a z) (- t x)))) (- t (* (/ y z) (- t x)))))
(+ x (/ (* (- y z) (- t x)) (- a z))))