x \cdot \left(\frac{y}{z} - \frac{t}{1 - z}\right)\begin{array}{l}
\mathbf{if}\;\frac{y}{z} - \frac{t}{1 - z} \le -8.1624099695663258 \cdot 10^{133}:\\
\;\;\;\;\left(\frac{x \cdot y}{z} + \left(-x\right) \cdot \frac{t}{1 - z}\right) + x \cdot \left(\frac{t}{1 - z} \cdot \left(\left(-1\right) + 1\right)\right)\\
\mathbf{elif}\;\frac{y}{z} - \frac{t}{1 - z} \le -8.59090119726614977 \cdot 10^{-199}:\\
\;\;\;\;x \cdot \mathsf{fma}\left(y, \frac{1}{z}, -\left(t \cdot \mathsf{expm1}\left(\mathsf{log1p}\left(\frac{1}{1 - z}\right)\right)\right) \cdot 1\right) + x \cdot \left(\frac{t}{1 - z} \cdot \left(\left(-1\right) + 1\right)\right)\\
\mathbf{elif}\;\frac{y}{z} - \frac{t}{1 - z} \le 1.38430042432179337 \cdot 10^{-257}:\\
\;\;\;\;\mathsf{fma}\left(y, \frac{x}{z}, \mathsf{fma}\left(1, \frac{t \cdot x}{{z}^{2}}, \frac{t \cdot x}{z}\right)\right) + x \cdot \left(\frac{t}{1 - z} \cdot \left(\left(-1\right) + 1\right)\right)\\
\mathbf{elif}\;\frac{y}{z} - \frac{t}{1 - z} \le 8.75750237438848121 \cdot 10^{196}:\\
\;\;\;\;x \cdot \mathsf{fma}\left(y, \frac{1}{z}, -\left(t \cdot \mathsf{expm1}\left(\mathsf{log1p}\left(\frac{1}{1 - z}\right)\right)\right) \cdot 1\right) + x \cdot \left(\frac{t}{1 - z} \cdot \left(\left(-1\right) + 1\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\left(\frac{x \cdot y}{z} + \left(-x\right) \cdot \frac{t}{1 - z}\right) + x \cdot \left(\frac{t}{1 - z} \cdot \left(\left(-1\right) + 1\right)\right)\\
\end{array}double f(double x, double y, double z, double t) {
double r368604 = x;
double r368605 = y;
double r368606 = z;
double r368607 = r368605 / r368606;
double r368608 = t;
double r368609 = 1.0;
double r368610 = r368609 - r368606;
double r368611 = r368608 / r368610;
double r368612 = r368607 - r368611;
double r368613 = r368604 * r368612;
return r368613;
}
double f(double x, double y, double z, double t) {
double r368614 = y;
double r368615 = z;
double r368616 = r368614 / r368615;
double r368617 = t;
double r368618 = 1.0;
double r368619 = r368618 - r368615;
double r368620 = r368617 / r368619;
double r368621 = r368616 - r368620;
double r368622 = -8.162409969566326e+133;
bool r368623 = r368621 <= r368622;
double r368624 = x;
double r368625 = r368624 * r368614;
double r368626 = r368625 / r368615;
double r368627 = -r368624;
double r368628 = r368627 * r368620;
double r368629 = r368626 + r368628;
double r368630 = 1.0;
double r368631 = -r368630;
double r368632 = r368631 + r368630;
double r368633 = r368620 * r368632;
double r368634 = r368624 * r368633;
double r368635 = r368629 + r368634;
double r368636 = -8.59090119726615e-199;
bool r368637 = r368621 <= r368636;
double r368638 = r368630 / r368615;
double r368639 = r368630 / r368619;
double r368640 = log1p(r368639);
double r368641 = expm1(r368640);
double r368642 = r368617 * r368641;
double r368643 = r368642 * r368630;
double r368644 = -r368643;
double r368645 = fma(r368614, r368638, r368644);
double r368646 = r368624 * r368645;
double r368647 = r368646 + r368634;
double r368648 = 1.3843004243217934e-257;
bool r368649 = r368621 <= r368648;
double r368650 = r368624 / r368615;
double r368651 = r368617 * r368624;
double r368652 = 2.0;
double r368653 = pow(r368615, r368652);
double r368654 = r368651 / r368653;
double r368655 = r368651 / r368615;
double r368656 = fma(r368618, r368654, r368655);
double r368657 = fma(r368614, r368650, r368656);
double r368658 = r368657 + r368634;
double r368659 = 8.757502374388481e+196;
bool r368660 = r368621 <= r368659;
double r368661 = r368660 ? r368647 : r368635;
double r368662 = r368649 ? r368658 : r368661;
double r368663 = r368637 ? r368647 : r368662;
double r368664 = r368623 ? r368635 : r368663;
return r368664;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 4.2 |
|---|---|
| Target | 4.1 |
| Herbie | 0.7 |
if (- (/ y z) (/ t (- 1.0 z))) < -8.162409969566326e+133 or 8.757502374388481e+196 < (- (/ y z) (/ t (- 1.0 z))) Initial program 13.9
rmApplied add-cube-cbrt14.3
Applied div-inv14.3
Applied prod-diff14.3
Applied distribute-lft-in14.3
Simplified14.0
Simplified13.9
rmApplied div-inv13.9
rmApplied fma-udef14.0
Applied distribute-lft-in14.0
Simplified1.8
Simplified1.8
if -8.162409969566326e+133 < (- (/ y z) (/ t (- 1.0 z))) < -8.59090119726615e-199 or 1.3843004243217934e-257 < (- (/ y z) (/ t (- 1.0 z))) < 8.757502374388481e+196Initial program 0.2
rmApplied add-cube-cbrt0.7
Applied div-inv0.8
Applied prod-diff0.8
Applied distribute-lft-in0.8
Simplified0.3
Simplified0.3
rmApplied div-inv0.3
rmApplied expm1-log1p-u0.3
if -8.59090119726615e-199 < (- (/ y z) (/ t (- 1.0 z))) < 1.3843004243217934e-257Initial program 9.0
rmApplied add-cube-cbrt9.2
Applied div-inv9.2
Applied prod-diff9.2
Applied distribute-lft-in9.2
Simplified9.1
Simplified9.1
Taylor expanded around inf 1.2
Simplified1.1
Final simplification0.7
herbie shell --seed 2020100 +o rules:numerics
(FPCore (x y z t)
:name "Numeric.SpecFunctions:invIncompleteBetaWorker from math-functions-0.1.5.2, C"
:precision binary64
:herbie-target
(if (< (* x (- (/ y z) (/ t (- 1 z)))) -7.623226303312042e-196) (* x (- (/ y z) (* t (/ 1 (- 1 z))))) (if (< (* x (- (/ y z) (/ t (- 1 z)))) 1.4133944927702302e-211) (+ (/ (* y x) z) (- (/ (* t x) (- 1 z)))) (* x (- (/ y z) (* t (/ 1 (- 1 z)))))))
(* x (- (/ y z) (/ t (- 1 z)))))