x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t}\begin{array}{l}
\mathbf{if}\;x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t} \le -5.099091687607698924885370566989707286778 \cdot 10^{-291}:\\
\;\;\;\;\left(\left(z - t\right) \cdot \frac{\sqrt[3]{y - x} \cdot \sqrt[3]{y - x}}{\sqrt[3]{a - t} \cdot \sqrt[3]{a - t}}\right) \cdot \frac{\sqrt[3]{y - x}}{\sqrt[3]{a - t}} + x\\
\mathbf{elif}\;x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t} \le 0.0:\\
\;\;\;\;\mathsf{fma}\left(\frac{x}{t}, z, y - \frac{z \cdot y}{t}\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{z - t}{\sqrt[3]{a - t} \cdot \sqrt[3]{a - t}} \cdot \frac{y - x}{\sqrt[3]{a - t}} + x\\
\end{array}double f(double x, double y, double z, double t, double a) {
double r461829 = x;
double r461830 = y;
double r461831 = r461830 - r461829;
double r461832 = z;
double r461833 = t;
double r461834 = r461832 - r461833;
double r461835 = r461831 * r461834;
double r461836 = a;
double r461837 = r461836 - r461833;
double r461838 = r461835 / r461837;
double r461839 = r461829 + r461838;
return r461839;
}
double f(double x, double y, double z, double t, double a) {
double r461840 = x;
double r461841 = y;
double r461842 = r461841 - r461840;
double r461843 = z;
double r461844 = t;
double r461845 = r461843 - r461844;
double r461846 = r461842 * r461845;
double r461847 = a;
double r461848 = r461847 - r461844;
double r461849 = r461846 / r461848;
double r461850 = r461840 + r461849;
double r461851 = -5.099091687607699e-291;
bool r461852 = r461850 <= r461851;
double r461853 = cbrt(r461842);
double r461854 = r461853 * r461853;
double r461855 = cbrt(r461848);
double r461856 = r461855 * r461855;
double r461857 = r461854 / r461856;
double r461858 = r461845 * r461857;
double r461859 = r461853 / r461855;
double r461860 = r461858 * r461859;
double r461861 = r461860 + r461840;
double r461862 = 0.0;
bool r461863 = r461850 <= r461862;
double r461864 = r461840 / r461844;
double r461865 = r461843 * r461841;
double r461866 = r461865 / r461844;
double r461867 = r461841 - r461866;
double r461868 = fma(r461864, r461843, r461867);
double r461869 = r461845 / r461856;
double r461870 = r461842 / r461855;
double r461871 = r461869 * r461870;
double r461872 = r461871 + r461840;
double r461873 = r461863 ? r461868 : r461872;
double r461874 = r461852 ? r461861 : r461873;
return r461874;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t




Bits error versus a
| Original | 24.4 |
|---|---|
| Target | 9.6 |
| Herbie | 9.2 |
if (+ x (/ (* (- y x) (- z t)) (- a t))) < -5.099091687607699e-291Initial program 20.5
Simplified10.3
rmApplied div-inv10.4
rmApplied fma-udef10.4
Simplified10.3
rmApplied add-cube-cbrt11.0
Applied add-cube-cbrt11.1
Applied times-frac11.1
Applied associate-*r*7.9
if -5.099091687607699e-291 < (+ x (/ (* (- y x) (- z t)) (- a t))) < 0.0Initial program 60.5
Simplified60.2
rmApplied div-inv60.0
rmApplied fma-udef60.3
Simplified60.4
Taylor expanded around inf 17.4
Simplified21.1
if 0.0 < (+ x (/ (* (- y x) (- z t)) (- a t))) Initial program 21.5
Simplified10.4
rmApplied div-inv10.4
rmApplied fma-udef10.5
Simplified10.4
rmApplied add-cube-cbrt11.0
Applied *-un-lft-identity11.0
Applied times-frac11.0
Applied associate-*r*8.2
Simplified8.2
Final simplification9.2
herbie shell --seed 2019306 +o rules:numerics
(FPCore (x y z t a)
:name "Graphics.Rendering.Chart.Axis.Types:linMap from Chart-1.5.3"
:precision binary64
:herbie-target
(if (< a -1.6153062845442575e-142) (+ x (* (/ (- y x) 1) (/ (- z t) (- a t)))) (if (< a 3.7744031700831742e-182) (- y (* (/ z t) (- y x))) (+ x (* (/ (- y x) 1) (/ (- z t) (- a t))))))
(+ x (/ (* (- y x) (- z t)) (- a t))))