| Alternative 1 | |
|---|---|
| Accuracy | 99.2% |
| Cost | 3280 |
(FPCore (x y z t) :precision binary64 (* x (- (/ y z) (/ t (- 1.0 z)))))
(FPCore (x y z t)
:precision binary64
(let* ((t_1 (/ y (/ z x))) (t_2 (- (/ y z) (/ t (- 1.0 z)))) (t_3 (* t_2 x)))
(if (<= t_2 (- INFINITY))
t_1
(if (<= t_2 -2e-172)
t_3
(if (<= t_2 1e-311)
(+ (* y (/ x z)) (* t (/ x z)))
(if (<= t_2 5e+299) t_3 t_1))))))double code(double x, double y, double z, double t) {
return x * ((y / z) - (t / (1.0 - z)));
}
double code(double x, double y, double z, double t) {
double t_1 = y / (z / x);
double t_2 = (y / z) - (t / (1.0 - z));
double t_3 = t_2 * x;
double tmp;
if (t_2 <= -((double) INFINITY)) {
tmp = t_1;
} else if (t_2 <= -2e-172) {
tmp = t_3;
} else if (t_2 <= 1e-311) {
tmp = (y * (x / z)) + (t * (x / z));
} else if (t_2 <= 5e+299) {
tmp = t_3;
} else {
tmp = t_1;
}
return tmp;
}
public static double code(double x, double y, double z, double t) {
return x * ((y / z) - (t / (1.0 - z)));
}
public static double code(double x, double y, double z, double t) {
double t_1 = y / (z / x);
double t_2 = (y / z) - (t / (1.0 - z));
double t_3 = t_2 * x;
double tmp;
if (t_2 <= -Double.POSITIVE_INFINITY) {
tmp = t_1;
} else if (t_2 <= -2e-172) {
tmp = t_3;
} else if (t_2 <= 1e-311) {
tmp = (y * (x / z)) + (t * (x / z));
} else if (t_2 <= 5e+299) {
tmp = t_3;
} else {
tmp = t_1;
}
return tmp;
}
def code(x, y, z, t): return x * ((y / z) - (t / (1.0 - z)))
def code(x, y, z, t): t_1 = y / (z / x) t_2 = (y / z) - (t / (1.0 - z)) t_3 = t_2 * x tmp = 0 if t_2 <= -math.inf: tmp = t_1 elif t_2 <= -2e-172: tmp = t_3 elif t_2 <= 1e-311: tmp = (y * (x / z)) + (t * (x / z)) elif t_2 <= 5e+299: tmp = t_3 else: tmp = t_1 return tmp
function code(x, y, z, t) return Float64(x * Float64(Float64(y / z) - Float64(t / Float64(1.0 - z)))) end
function code(x, y, z, t) t_1 = Float64(y / Float64(z / x)) t_2 = Float64(Float64(y / z) - Float64(t / Float64(1.0 - z))) t_3 = Float64(t_2 * x) tmp = 0.0 if (t_2 <= Float64(-Inf)) tmp = t_1; elseif (t_2 <= -2e-172) tmp = t_3; elseif (t_2 <= 1e-311) tmp = Float64(Float64(y * Float64(x / z)) + Float64(t * Float64(x / z))); elseif (t_2 <= 5e+299) tmp = t_3; else tmp = t_1; end return tmp end
function tmp = code(x, y, z, t) tmp = x * ((y / z) - (t / (1.0 - z))); end
function tmp_2 = code(x, y, z, t) t_1 = y / (z / x); t_2 = (y / z) - (t / (1.0 - z)); t_3 = t_2 * x; tmp = 0.0; if (t_2 <= -Inf) tmp = t_1; elseif (t_2 <= -2e-172) tmp = t_3; elseif (t_2 <= 1e-311) tmp = (y * (x / z)) + (t * (x / z)); elseif (t_2 <= 5e+299) tmp = t_3; else tmp = t_1; end tmp_2 = tmp; end
code[x_, y_, z_, t_] := N[(x * N[(N[(y / z), $MachinePrecision] - N[(t / N[(1.0 - z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
code[x_, y_, z_, t_] := Block[{t$95$1 = N[(y / N[(z / x), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$2 = N[(N[(y / z), $MachinePrecision] - N[(t / N[(1.0 - z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$3 = N[(t$95$2 * x), $MachinePrecision]}, If[LessEqual[t$95$2, (-Infinity)], t$95$1, If[LessEqual[t$95$2, -2e-172], t$95$3, If[LessEqual[t$95$2, 1e-311], N[(N[(y * N[(x / z), $MachinePrecision]), $MachinePrecision] + N[(t * N[(x / z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[t$95$2, 5e+299], t$95$3, t$95$1]]]]]]]
x \cdot \left(\frac{y}{z} - \frac{t}{1 - z}\right)
\begin{array}{l}
t_1 := \frac{y}{\frac{z}{x}}\\
t_2 := \frac{y}{z} - \frac{t}{1 - z}\\
t_3 := t_2 \cdot x\\
\mathbf{if}\;t_2 \leq -\infty:\\
\;\;\;\;t_1\\
\mathbf{elif}\;t_2 \leq -2 \cdot 10^{-172}:\\
\;\;\;\;t_3\\
\mathbf{elif}\;t_2 \leq 10^{-311}:\\
\;\;\;\;y \cdot \frac{x}{z} + t \cdot \frac{x}{z}\\
\mathbf{elif}\;t_2 \leq 5 \cdot 10^{+299}:\\
\;\;\;\;t_3\\
\mathbf{else}:\\
\;\;\;\;t_1\\
\end{array}
Results
| Original | 92.5% |
|---|---|
| Target | 93.2% |
| Herbie | 99.2% |
if (-.f64 (/.f64 y z) (/.f64 t (-.f64 1 z))) < -inf.0 or 5.0000000000000003e299 < (-.f64 (/.f64 y z) (/.f64 t (-.f64 1 z))) Initial program 5.1%
Applied egg-rr5.1%
[Start]5.1 | \[ x \cdot \left(\frac{y}{z} - \frac{t}{1 - z}\right)
\] |
|---|---|
frac-2neg [=>]5.1 | \[ x \cdot \left(\color{blue}{\frac{-y}{-z}} - \frac{t}{1 - z}\right)
\] |
div-inv [=>]5.1 | \[ x \cdot \left(\color{blue}{\left(-y\right) \cdot \frac{1}{-z}} - \frac{t}{1 - z}\right)
\] |
fma-neg [=>]5.1 | \[ x \cdot \color{blue}{\mathsf{fma}\left(-y, \frac{1}{-z}, -\frac{t}{1 - z}\right)}
\] |
distribute-neg-frac [=>]5.1 | \[ x \cdot \mathsf{fma}\left(-y, \frac{1}{-z}, \color{blue}{\frac{-t}{1 - z}}\right)
\] |
Simplified5.1%
[Start]5.1 | \[ x \cdot \mathsf{fma}\left(-y, \frac{1}{-z}, \frac{-t}{1 - z}\right)
\] |
|---|---|
fma-udef [=>]5.1 | \[ x \cdot \color{blue}{\left(\left(-y\right) \cdot \frac{1}{-z} + \frac{-t}{1 - z}\right)}
\] |
+-commutative [=>]5.1 | \[ x \cdot \color{blue}{\left(\frac{-t}{1 - z} + \left(-y\right) \cdot \frac{1}{-z}\right)}
\] |
distribute-lft-neg-out [=>]5.1 | \[ x \cdot \left(\frac{-t}{1 - z} + \color{blue}{\left(-y \cdot \frac{1}{-z}\right)}\right)
\] |
unsub-neg [=>]5.1 | \[ x \cdot \color{blue}{\left(\frac{-t}{1 - z} - y \cdot \frac{1}{-z}\right)}
\] |
neg-mul-1 [=>]5.1 | \[ x \cdot \left(\frac{\color{blue}{-1 \cdot t}}{1 - z} - y \cdot \frac{1}{-z}\right)
\] |
*-commutative [=>]5.1 | \[ x \cdot \left(\frac{\color{blue}{t \cdot -1}}{1 - z} - y \cdot \frac{1}{-z}\right)
\] |
associate-*r/ [<=]5.1 | \[ x \cdot \left(\color{blue}{t \cdot \frac{-1}{1 - z}} - y \cdot \frac{1}{-z}\right)
\] |
metadata-eval [<=]5.1 | \[ x \cdot \left(t \cdot \frac{\color{blue}{\frac{1}{-1}}}{1 - z} - y \cdot \frac{1}{-z}\right)
\] |
associate-/r* [<=]5.1 | \[ x \cdot \left(t \cdot \color{blue}{\frac{1}{-1 \cdot \left(1 - z\right)}} - y \cdot \frac{1}{-z}\right)
\] |
neg-mul-1 [<=]5.1 | \[ x \cdot \left(t \cdot \frac{1}{\color{blue}{-\left(1 - z\right)}} - y \cdot \frac{1}{-z}\right)
\] |
associate-*r/ [=>]5.1 | \[ x \cdot \left(\color{blue}{\frac{t \cdot 1}{-\left(1 - z\right)}} - y \cdot \frac{1}{-z}\right)
\] |
*-rgt-identity [=>]5.1 | \[ x \cdot \left(\frac{\color{blue}{t}}{-\left(1 - z\right)} - y \cdot \frac{1}{-z}\right)
\] |
neg-sub0 [=>]5.1 | \[ x \cdot \left(\frac{t}{\color{blue}{0 - \left(1 - z\right)}} - y \cdot \frac{1}{-z}\right)
\] |
associate--r- [=>]5.1 | \[ x \cdot \left(\frac{t}{\color{blue}{\left(0 - 1\right) + z}} - y \cdot \frac{1}{-z}\right)
\] |
metadata-eval [=>]5.1 | \[ x \cdot \left(\frac{t}{\color{blue}{-1} + z} - y \cdot \frac{1}{-z}\right)
\] |
neg-mul-1 [=>]5.1 | \[ x \cdot \left(\frac{t}{-1 + z} - y \cdot \frac{1}{\color{blue}{-1 \cdot z}}\right)
\] |
associate-/r* [=>]5.1 | \[ x \cdot \left(\frac{t}{-1 + z} - y \cdot \color{blue}{\frac{\frac{1}{-1}}{z}}\right)
\] |
metadata-eval [=>]5.1 | \[ x \cdot \left(\frac{t}{-1 + z} - y \cdot \frac{\color{blue}{-1}}{z}\right)
\] |
Taylor expanded in t around 0 97.2%
Simplified97.2%
[Start]97.2 | \[ \frac{y \cdot x}{z}
\] |
|---|---|
associate-/l* [=>]97.2 | \[ \color{blue}{\frac{y}{\frac{z}{x}}}
\] |
if -inf.0 < (-.f64 (/.f64 y z) (/.f64 t (-.f64 1 z))) < -2.0000000000000001e-172 or 9.99999999999948e-312 < (-.f64 (/.f64 y z) (/.f64 t (-.f64 1 z))) < 5.0000000000000003e299Initial program 99.7%
if -2.0000000000000001e-172 < (-.f64 (/.f64 y z) (/.f64 t (-.f64 1 z))) < 9.99999999999948e-312Initial program 82.7%
Taylor expanded in z around inf 97.3%
Simplified78.8%
[Start]97.3 | \[ \frac{\left(y - -1 \cdot t\right) \cdot x}{z}
\] |
|---|---|
*-commutative [<=]97.3 | \[ \frac{\color{blue}{x \cdot \left(y - -1 \cdot t\right)}}{z}
\] |
associate-/l* [=>]78.8 | \[ \color{blue}{\frac{x}{\frac{z}{y - -1 \cdot t}}}
\] |
neg-mul-1 [<=]78.8 | \[ \frac{x}{\frac{z}{y - \color{blue}{\left(-t\right)}}}
\] |
Applied egg-rr96.7%
[Start]78.8 | \[ \frac{x}{\frac{z}{y - \left(-t\right)}}
\] |
|---|---|
associate-/r/ [=>]96.7 | \[ \color{blue}{\frac{x}{z} \cdot \left(y - \left(-t\right)\right)}
\] |
sub-neg [=>]96.7 | \[ \frac{x}{z} \cdot \color{blue}{\left(y + \left(-\left(-t\right)\right)\right)}
\] |
remove-double-neg [=>]96.7 | \[ \frac{x}{z} \cdot \left(y + \color{blue}{t}\right)
\] |
distribute-lft-in [=>]96.7 | \[ \color{blue}{\frac{x}{z} \cdot y + \frac{x}{z} \cdot t}
\] |
Final simplification99.2%
| Alternative 1 | |
|---|---|
| Accuracy | 99.2% |
| Cost | 3280 |
| Alternative 2 | |
|---|---|
| Accuracy | 56.7% |
| Cost | 1244 |
| Alternative 3 | |
|---|---|
| Accuracy | 67.6% |
| Cost | 1240 |
| Alternative 4 | |
|---|---|
| Accuracy | 67.8% |
| Cost | 1240 |
| Alternative 5 | |
|---|---|
| Accuracy | 58.0% |
| Cost | 1112 |
| Alternative 6 | |
|---|---|
| Accuracy | 58.3% |
| Cost | 1112 |
| Alternative 7 | |
|---|---|
| Accuracy | 58.4% |
| Cost | 1112 |
| Alternative 8 | |
|---|---|
| Accuracy | 85.6% |
| Cost | 976 |
| Alternative 9 | |
|---|---|
| Accuracy | 91.6% |
| Cost | 713 |
| Alternative 10 | |
|---|---|
| Accuracy | 44.2% |
| Cost | 585 |
| Alternative 11 | |
|---|---|
| Accuracy | 47.1% |
| Cost | 585 |
| Alternative 12 | |
|---|---|
| Accuracy | 20.6% |
| Cost | 256 |
herbie shell --seed 2023147
(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.0 z)))) -7.623226303312042e-196) (* x (- (/ y z) (* t (/ 1.0 (- 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.0 (- 1.0 z)))))))
(* x (- (/ y z) (/ t (- 1.0 z)))))