Average Error: 4.2 → 3.7
Time: 1.5m
Precision: 64
Internal Precision: 384
\[x \cdot \left(\frac{y}{z} - \frac{t}{1.0 - z}\right)\]
↓
\[\begin{array}{l}
\mathbf{if}\;x \cdot \left(\frac{y}{z} - \frac{t}{1.0 - z}\right) \le -7.467050170486849 \cdot 10^{+121}:\\
\;\;\;\;\left(x \cdot y\right) \cdot \frac{1}{z} + x \cdot \left(-\frac{t}{1.0 - z}\right)\\
\mathbf{if}\;x \cdot \left(\frac{y}{z} - \frac{t}{1.0 - z}\right) \le 2.70893052731898 \cdot 10^{+154}:\\
\;\;\;\;x \cdot \frac{y}{z} + \left(x \cdot \left(-t\right)\right) \cdot \frac{1}{1.0 - z}\\
\mathbf{else}:\\
\;\;\;\;\left(x \cdot y\right) \cdot \frac{1}{z} + x \cdot \left(-\frac{t}{1.0 - z}\right)\\
\end{array}\]
Target
| Original | 4.2 |
|---|
| Target | 3.9 |
|---|
| Herbie | 3.7 |
|---|
\[\begin{array}{l}
\mathbf{if}\;x \cdot \left(\frac{y}{z} - \frac{t}{1.0 - z}\right) \lt -7.623226303312042 \cdot 10^{-196}:\\
\;\;\;\;x \cdot \left(\frac{y}{z} - t \cdot \frac{1}{1.0 - z}\right)\\
\mathbf{if}\;x \cdot \left(\frac{y}{z} - \frac{t}{1.0 - z}\right) \lt 1.4133944927702302 \cdot 10^{-211}:\\
\;\;\;\;\frac{y \cdot x}{z} + \left(-\frac{t \cdot x}{1.0 - z}\right)\\
\mathbf{else}:\\
\;\;\;\;x \cdot \left(\frac{y}{z} - t \cdot \frac{1}{1.0 - z}\right)\\
\end{array}\]
Derivation
- Split input into 2 regimes
if (* x (- (/ y z) (/ t (- 1.0 z)))) < -7.467050170486849e+121 or 2.70893052731898e+154 < (* x (- (/ y z) (/ t (- 1.0 z))))
Initial program 11.1
\[x \cdot \left(\frac{y}{z} - \frac{t}{1.0 - z}\right)\]
- Using strategy
rm Applied sub-neg11.1
\[\leadsto x \cdot \color{blue}{\left(\frac{y}{z} + \left(-\frac{t}{1.0 - z}\right)\right)}\]
Applied distribute-lft-in11.1
\[\leadsto \color{blue}{x \cdot \frac{y}{z} + x \cdot \left(-\frac{t}{1.0 - z}\right)}\]
- Using strategy
rm Applied div-inv11.1
\[\leadsto x \cdot \color{blue}{\left(y \cdot \frac{1}{z}\right)} + x \cdot \left(-\frac{t}{1.0 - z}\right)\]
Applied associate-*r*8.5
\[\leadsto \color{blue}{\left(x \cdot y\right) \cdot \frac{1}{z}} + x \cdot \left(-\frac{t}{1.0 - z}\right)\]
if -7.467050170486849e+121 < (* x (- (/ y z) (/ t (- 1.0 z)))) < 2.70893052731898e+154
Initial program 1.5
\[x \cdot \left(\frac{y}{z} - \frac{t}{1.0 - z}\right)\]
- Using strategy
rm Applied sub-neg1.5
\[\leadsto x \cdot \color{blue}{\left(\frac{y}{z} + \left(-\frac{t}{1.0 - z}\right)\right)}\]
Applied distribute-lft-in1.5
\[\leadsto \color{blue}{x \cdot \frac{y}{z} + x \cdot \left(-\frac{t}{1.0 - z}\right)}\]
- Using strategy
rm Applied div-inv1.5
\[\leadsto x \cdot \frac{y}{z} + x \cdot \left(-\color{blue}{t \cdot \frac{1}{1.0 - z}}\right)\]
Applied distribute-lft-neg-in1.5
\[\leadsto x \cdot \frac{y}{z} + x \cdot \color{blue}{\left(\left(-t\right) \cdot \frac{1}{1.0 - z}\right)}\]
Applied associate-*r*1.8
\[\leadsto x \cdot \frac{y}{z} + \color{blue}{\left(x \cdot \left(-t\right)\right) \cdot \frac{1}{1.0 - z}}\]
- Recombined 2 regimes into one program.
- Removed slow
pow expressions.
Runtime
herbie shell --seed '#(1567391828 2030694642 2833800258 828025724 3004380912 3532991858)' +o setup:early-exit
(FPCore (x y z t)
:name "Numeric.SpecFunctions:invIncompleteBetaWorker from math-functions-0.1.5.2, C"
:herbie-target
(if (< (* x (- (/ y z) (/ t (- 1.0 z)))) -7.623226303312042e-196) (* x (- (/ y z) (* t (/ 1 (- 1.0 z))))) (if (< (* x (- (/ y z) (/ t (- 1.0 z)))) 1.4133944927702302e-211) (+ (/ (* y x) z) (- (/ (* t x) (- 1.0 z)))) (* x (- (/ y z) (* t (/ 1 (- 1.0 z)))))))
(* x (- (/ y z) (/ t (- 1.0 z)))))