| Alternative 1 | |
|---|---|
| Accuracy | 98.8% |
| Cost | 1604 |

(FPCore (x y z t a) :precision binary64 (+ x (* y (/ (- z t) (- a t)))))
(FPCore (x y z t a) :precision binary64 (if (<= (/ (- z t) (- a t)) -4e+184) (+ (* (- t z) (/ y (- t a))) x) (+ x (- (/ y (/ (- a t) z)) (/ y (+ (/ a t) -1.0))))))
double code(double x, double y, double z, double t, double a) {
return x + (y * ((z - t) / (a - t)));
}
double code(double x, double y, double z, double t, double a) {
double tmp;
if (((z - t) / (a - t)) <= -4e+184) {
tmp = ((t - z) * (y / (t - a))) + x;
} else {
tmp = x + ((y / ((a - t) / z)) - (y / ((a / t) + -1.0)));
}
return tmp;
}
real(8) function code(x, y, z, t, a)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8), intent (in) :: t
real(8), intent (in) :: a
code = x + (y * ((z - t) / (a - t)))
end function
real(8) function code(x, y, z, t, a)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8), intent (in) :: t
real(8), intent (in) :: a
real(8) :: tmp
if (((z - t) / (a - t)) <= (-4d+184)) then
tmp = ((t - z) * (y / (t - a))) + x
else
tmp = x + ((y / ((a - t) / z)) - (y / ((a / t) + (-1.0d0))))
end if
code = tmp
end function
public static double code(double x, double y, double z, double t, double a) {
return x + (y * ((z - t) / (a - t)));
}
public static double code(double x, double y, double z, double t, double a) {
double tmp;
if (((z - t) / (a - t)) <= -4e+184) {
tmp = ((t - z) * (y / (t - a))) + x;
} else {
tmp = x + ((y / ((a - t) / z)) - (y / ((a / t) + -1.0)));
}
return tmp;
}
def code(x, y, z, t, a): return x + (y * ((z - t) / (a - t)))
def code(x, y, z, t, a): tmp = 0 if ((z - t) / (a - t)) <= -4e+184: tmp = ((t - z) * (y / (t - a))) + x else: tmp = x + ((y / ((a - t) / z)) - (y / ((a / t) + -1.0))) return tmp
function code(x, y, z, t, a) return Float64(x + Float64(y * Float64(Float64(z - t) / Float64(a - t)))) end
function code(x, y, z, t, a) tmp = 0.0 if (Float64(Float64(z - t) / Float64(a - t)) <= -4e+184) tmp = Float64(Float64(Float64(t - z) * Float64(y / Float64(t - a))) + x); else tmp = Float64(x + Float64(Float64(y / Float64(Float64(a - t) / z)) - Float64(y / Float64(Float64(a / t) + -1.0)))); end return tmp end
function tmp = code(x, y, z, t, a) tmp = x + (y * ((z - t) / (a - t))); end
function tmp_2 = code(x, y, z, t, a) tmp = 0.0; if (((z - t) / (a - t)) <= -4e+184) tmp = ((t - z) * (y / (t - a))) + x; else tmp = x + ((y / ((a - t) / z)) - (y / ((a / t) + -1.0))); end tmp_2 = tmp; end
code[x_, y_, z_, t_, a_] := N[(x + N[(y * N[(N[(z - t), $MachinePrecision] / N[(a - t), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
code[x_, y_, z_, t_, a_] := If[LessEqual[N[(N[(z - t), $MachinePrecision] / N[(a - t), $MachinePrecision]), $MachinePrecision], -4e+184], N[(N[(N[(t - z), $MachinePrecision] * N[(y / N[(t - a), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + x), $MachinePrecision], N[(x + N[(N[(y / N[(N[(a - t), $MachinePrecision] / z), $MachinePrecision]), $MachinePrecision] - N[(y / N[(N[(a / t), $MachinePrecision] + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
x + y \cdot \frac{z - t}{a - t}
\begin{array}{l}
\mathbf{if}\;\frac{z - t}{a - t} \leq -4 \cdot 10^{+184}:\\
\;\;\;\;\left(t - z\right) \cdot \frac{y}{t - a} + x\\
\mathbf{else}:\\
\;\;\;\;x + \left(\frac{y}{\frac{a - t}{z}} - \frac{y}{\frac{a}{t} + -1}\right)\\
\end{array}
Herbie found 13 alternatives:
| Alternative | Accuracy | Speedup |
|---|
Results
| Original | 98.2% |
|---|---|
| Target | 99.3% |
| Herbie | 98.8% |
if (/.f64 (-.f64 z t) (-.f64 a t)) < -4.00000000000000007e184Initial program 79.4%
Simplified99.9%
[Start]79.4% | \[ x + y \cdot \frac{z - t}{a - t}
\] |
|---|---|
+-commutative [=>]79.4% | \[ \color{blue}{y \cdot \frac{z - t}{a - t} + x}
\] |
*-commutative [=>]79.4% | \[ \color{blue}{\frac{z - t}{a - t} \cdot y} + x
\] |
associate-*l/ [=>]99.8% | \[ \color{blue}{\frac{\left(z - t\right) \cdot y}{a - t}} + x
\] |
sub-neg [=>]99.8% | \[ \frac{\left(z - t\right) \cdot y}{\color{blue}{a + \left(-t\right)}} + x
\] |
+-commutative [=>]99.8% | \[ \frac{\left(z - t\right) \cdot y}{\color{blue}{\left(-t\right) + a}} + x
\] |
neg-sub0 [=>]99.8% | \[ \frac{\left(z - t\right) \cdot y}{\color{blue}{\left(0 - t\right)} + a} + x
\] |
associate-+l- [=>]99.8% | \[ \frac{\left(z - t\right) \cdot y}{\color{blue}{0 - \left(t - a\right)}} + x
\] |
sub0-neg [=>]99.8% | \[ \frac{\left(z - t\right) \cdot y}{\color{blue}{-\left(t - a\right)}} + x
\] |
neg-mul-1 [=>]99.8% | \[ \frac{\left(z - t\right) \cdot y}{\color{blue}{-1 \cdot \left(t - a\right)}} + x
\] |
times-frac [=>]99.9% | \[ \color{blue}{\frac{z - t}{-1} \cdot \frac{y}{t - a}} + x
\] |
fma-def [=>]99.9% | \[ \color{blue}{\mathsf{fma}\left(\frac{z - t}{-1}, \frac{y}{t - a}, x\right)}
\] |
sub-neg [=>]99.9% | \[ \mathsf{fma}\left(\frac{\color{blue}{z + \left(-t\right)}}{-1}, \frac{y}{t - a}, x\right)
\] |
+-commutative [=>]99.9% | \[ \mathsf{fma}\left(\frac{\color{blue}{\left(-t\right) + z}}{-1}, \frac{y}{t - a}, x\right)
\] |
neg-sub0 [=>]99.9% | \[ \mathsf{fma}\left(\frac{\color{blue}{\left(0 - t\right)} + z}{-1}, \frac{y}{t - a}, x\right)
\] |
associate-+l- [=>]99.9% | \[ \mathsf{fma}\left(\frac{\color{blue}{0 - \left(t - z\right)}}{-1}, \frac{y}{t - a}, x\right)
\] |
sub0-neg [=>]99.9% | \[ \mathsf{fma}\left(\frac{\color{blue}{-\left(t - z\right)}}{-1}, \frac{y}{t - a}, x\right)
\] |
neg-mul-1 [=>]99.9% | \[ \mathsf{fma}\left(\frac{\color{blue}{-1 \cdot \left(t - z\right)}}{-1}, \frac{y}{t - a}, x\right)
\] |
*-commutative [=>]99.9% | \[ \mathsf{fma}\left(\frac{\color{blue}{\left(t - z\right) \cdot -1}}{-1}, \frac{y}{t - a}, x\right)
\] |
associate-/l* [=>]99.9% | \[ \mathsf{fma}\left(\color{blue}{\frac{t - z}{\frac{-1}{-1}}}, \frac{y}{t - a}, x\right)
\] |
metadata-eval [=>]99.9% | \[ \mathsf{fma}\left(\frac{t - z}{\color{blue}{1}}, \frac{y}{t - a}, x\right)
\] |
/-rgt-identity [=>]99.9% | \[ \mathsf{fma}\left(\color{blue}{t - z}, \frac{y}{t - a}, x\right)
\] |
Applied egg-rr99.9%
[Start]99.9% | \[ \mathsf{fma}\left(t - z, \frac{y}{t - a}, x\right)
\] |
|---|---|
fma-udef [=>]99.9% | \[ \color{blue}{\left(t - z\right) \cdot \frac{y}{t - a} + x}
\] |
if -4.00000000000000007e184 < (/.f64 (-.f64 z t) (-.f64 a t)) Initial program 98.6%
Taylor expanded in z around 0 82.4%
Simplified98.7%
[Start]82.4% | \[ x + \left(\frac{y \cdot z}{a - t} + -1 \cdot \frac{y \cdot t}{a - t}\right)
\] |
|---|---|
mul-1-neg [=>]82.4% | \[ x + \left(\frac{y \cdot z}{a - t} + \color{blue}{\left(-\frac{y \cdot t}{a - t}\right)}\right)
\] |
unsub-neg [=>]82.4% | \[ x + \color{blue}{\left(\frac{y \cdot z}{a - t} - \frac{y \cdot t}{a - t}\right)}
\] |
associate-/l* [=>]85.0% | \[ x + \left(\color{blue}{\frac{y}{\frac{a - t}{z}}} - \frac{y \cdot t}{a - t}\right)
\] |
associate-/l* [=>]98.7% | \[ x + \left(\frac{y}{\frac{a - t}{z}} - \color{blue}{\frac{y}{\frac{a - t}{t}}}\right)
\] |
div-sub [=>]98.7% | \[ x + \left(\frac{y}{\frac{a - t}{z}} - \frac{y}{\color{blue}{\frac{a}{t} - \frac{t}{t}}}\right)
\] |
*-inverses [=>]98.7% | \[ x + \left(\frac{y}{\frac{a - t}{z}} - \frac{y}{\frac{a}{t} - \color{blue}{1}}\right)
\] |
Final simplification98.8%
| Alternative 1 | |
|---|---|
| Accuracy | 98.8% |
| Cost | 1604 |
| Alternative 2 | |
|---|---|
| Accuracy | 98.7% |
| Cost | 1220 |
| Alternative 3 | |
|---|---|
| Accuracy | 98.8% |
| Cost | 1220 |
| Alternative 4 | |
|---|---|
| Accuracy | 82.8% |
| Cost | 972 |
| Alternative 5 | |
|---|---|
| Accuracy | 82.8% |
| Cost | 972 |
| Alternative 6 | |
|---|---|
| Accuracy | 77.1% |
| Cost | 841 |
| Alternative 7 | |
|---|---|
| Accuracy | 82.8% |
| Cost | 841 |
| Alternative 8 | |
|---|---|
| Accuracy | 62.8% |
| Cost | 713 |
| Alternative 9 | |
|---|---|
| Accuracy | 75.9% |
| Cost | 713 |
| Alternative 10 | |
|---|---|
| Accuracy | 75.9% |
| Cost | 713 |
| Alternative 11 | |
|---|---|
| Accuracy | 60.6% |
| Cost | 516 |
| Alternative 12 | |
|---|---|
| Accuracy | 60.2% |
| Cost | 192 |
| Alternative 13 | |
|---|---|
| Accuracy | 51.0% |
| Cost | 64 |
herbie shell --seed 2023263
(FPCore (x y z t a)
:name "Graphics.Rendering.Plot.Render.Plot.Axis:renderAxisLine from plot-0.2.3.4, B"
:precision binary64
:herbie-target
(if (< y -8.508084860551241e-17) (+ x (* y (/ (- z t) (- a t)))) (if (< y 2.894426862792089e-49) (+ x (* (* y (- z t)) (/ 1.0 (- a t)))) (+ x (* y (/ (- z t) (- a t))))))
(+ x (* y (/ (- z t) (- a t)))))