| Alternative 1 | |
|---|---|
| Error | 2.83% |
| Cost | 13632 |
\[\frac{1}{\mathsf{hypot}\left(1, z\right)} \cdot \frac{\frac{1}{x}}{\mathsf{hypot}\left(1, z\right) \cdot y}
\]
(FPCore (x y z) :precision binary64 (/ (/ 1.0 x) (* y (+ 1.0 (* z z)))))
(FPCore (x y z)
:precision binary64
(if (<= z -4.5e+179)
(/ (/ 1.0 z) (* x (* z y)))
(if (<= z 1.55e+31)
(/ (/ (/ 1.0 x) y) (+ 1.0 (* z z)))
(/ (/ 1.0 (* y (* z x))) z))))double code(double x, double y, double z) {
return (1.0 / x) / (y * (1.0 + (z * z)));
}
double code(double x, double y, double z) {
double tmp;
if (z <= -4.5e+179) {
tmp = (1.0 / z) / (x * (z * y));
} else if (z <= 1.55e+31) {
tmp = ((1.0 / x) / y) / (1.0 + (z * z));
} else {
tmp = (1.0 / (y * (z * x))) / z;
}
return tmp;
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = (1.0d0 / x) / (y * (1.0d0 + (z * z)))
end function
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8) :: tmp
if (z <= (-4.5d+179)) then
tmp = (1.0d0 / z) / (x * (z * y))
else if (z <= 1.55d+31) then
tmp = ((1.0d0 / x) / y) / (1.0d0 + (z * z))
else
tmp = (1.0d0 / (y * (z * x))) / z
end if
code = tmp
end function
public static double code(double x, double y, double z) {
return (1.0 / x) / (y * (1.0 + (z * z)));
}
public static double code(double x, double y, double z) {
double tmp;
if (z <= -4.5e+179) {
tmp = (1.0 / z) / (x * (z * y));
} else if (z <= 1.55e+31) {
tmp = ((1.0 / x) / y) / (1.0 + (z * z));
} else {
tmp = (1.0 / (y * (z * x))) / z;
}
return tmp;
}
def code(x, y, z): return (1.0 / x) / (y * (1.0 + (z * z)))
def code(x, y, z): tmp = 0 if z <= -4.5e+179: tmp = (1.0 / z) / (x * (z * y)) elif z <= 1.55e+31: tmp = ((1.0 / x) / y) / (1.0 + (z * z)) else: tmp = (1.0 / (y * (z * x))) / z return tmp
function code(x, y, z) return Float64(Float64(1.0 / x) / Float64(y * Float64(1.0 + Float64(z * z)))) end
function code(x, y, z) tmp = 0.0 if (z <= -4.5e+179) tmp = Float64(Float64(1.0 / z) / Float64(x * Float64(z * y))); elseif (z <= 1.55e+31) tmp = Float64(Float64(Float64(1.0 / x) / y) / Float64(1.0 + Float64(z * z))); else tmp = Float64(Float64(1.0 / Float64(y * Float64(z * x))) / z); end return tmp end
function tmp = code(x, y, z) tmp = (1.0 / x) / (y * (1.0 + (z * z))); end
function tmp_2 = code(x, y, z) tmp = 0.0; if (z <= -4.5e+179) tmp = (1.0 / z) / (x * (z * y)); elseif (z <= 1.55e+31) tmp = ((1.0 / x) / y) / (1.0 + (z * z)); else tmp = (1.0 / (y * (z * x))) / z; end tmp_2 = tmp; end
code[x_, y_, z_] := N[(N[(1.0 / x), $MachinePrecision] / N[(y * N[(1.0 + N[(z * z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
code[x_, y_, z_] := If[LessEqual[z, -4.5e+179], N[(N[(1.0 / z), $MachinePrecision] / N[(x * N[(z * y), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[z, 1.55e+31], N[(N[(N[(1.0 / x), $MachinePrecision] / y), $MachinePrecision] / N[(1.0 + N[(z * z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(N[(1.0 / N[(y * N[(z * x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / z), $MachinePrecision]]]
\frac{\frac{1}{x}}{y \cdot \left(1 + z \cdot z\right)}
\begin{array}{l}
\mathbf{if}\;z \leq -4.5 \cdot 10^{+179}:\\
\;\;\;\;\frac{\frac{1}{z}}{x \cdot \left(z \cdot y\right)}\\
\mathbf{elif}\;z \leq 1.55 \cdot 10^{+31}:\\
\;\;\;\;\frac{\frac{\frac{1}{x}}{y}}{1 + z \cdot z}\\
\mathbf{else}:\\
\;\;\;\;\frac{\frac{1}{y \cdot \left(z \cdot x\right)}}{z}\\
\end{array}
Results
| Original | 10.15% |
|---|---|
| Target | 8.1% |
| Herbie | 4.03% |
if z < -4.5000000000000003e179Initial program 27.17
Taylor expanded in z around inf 27.17
Simplified12.96
[Start]27.17 | \[ \frac{1}{y \cdot \left({z}^{2} \cdot x\right)}
\] |
|---|---|
*-commutative [=>]27.17 | \[ \frac{1}{\color{blue}{\left({z}^{2} \cdot x\right) \cdot y}}
\] |
associate-/r* [=>]27.17 | \[ \color{blue}{\frac{\frac{1}{{z}^{2} \cdot x}}{y}}
\] |
unpow2 [=>]27.17 | \[ \frac{\frac{1}{\color{blue}{\left(z \cdot z\right)} \cdot x}}{y}
\] |
associate-*l* [=>]12.96 | \[ \frac{\frac{1}{\color{blue}{z \cdot \left(z \cdot x\right)}}}{y}
\] |
Applied egg-rr2.07
Applied egg-rr2.06
if -4.5000000000000003e179 < z < 1.5500000000000001e31Initial program 3.83
Simplified3.91
[Start]3.83 | \[ \frac{\frac{1}{x}}{y \cdot \left(1 + z \cdot z\right)}
\] |
|---|---|
associate-/r* [=>]3.91 | \[ \color{blue}{\frac{\frac{\frac{1}{x}}{y}}{1 + z \cdot z}}
\] |
if 1.5500000000000001e31 < z Initial program 18.92
Taylor expanded in z around inf 18.05
Simplified9.78
[Start]18.05 | \[ \frac{1}{y \cdot \left({z}^{2} \cdot x\right)}
\] |
|---|---|
*-commutative [=>]18.05 | \[ \frac{1}{\color{blue}{\left({z}^{2} \cdot x\right) \cdot y}}
\] |
associate-/r* [=>]17.75 | \[ \color{blue}{\frac{\frac{1}{{z}^{2} \cdot x}}{y}}
\] |
unpow2 [=>]17.75 | \[ \frac{\frac{1}{\color{blue}{\left(z \cdot z\right)} \cdot x}}{y}
\] |
associate-*l* [=>]9.78 | \[ \frac{\frac{1}{\color{blue}{z \cdot \left(z \cdot x\right)}}}{y}
\] |
Applied egg-rr4.12
Applied egg-rr5.32
Final simplification4.03
| Alternative 1 | |
|---|---|
| Error | 2.83% |
| Cost | 13632 |
| Alternative 2 | |
|---|---|
| Error | 1.24% |
| Cost | 7492 |
| Alternative 3 | |
|---|---|
| Error | 3% |
| Cost | 968 |
| Alternative 4 | |
|---|---|
| Error | 2.74% |
| Cost | 968 |
| Alternative 5 | |
|---|---|
| Error | 4.33% |
| Cost | 968 |
| Alternative 6 | |
|---|---|
| Error | 6.54% |
| Cost | 840 |
| Alternative 7 | |
|---|---|
| Error | 6.63% |
| Cost | 840 |
| Alternative 8 | |
|---|---|
| Error | 6.52% |
| Cost | 840 |
| Alternative 9 | |
|---|---|
| Error | 3.71% |
| Cost | 840 |
| Alternative 10 | |
|---|---|
| Error | 7.44% |
| Cost | 836 |
| Alternative 11 | |
|---|---|
| Error | 4.31% |
| Cost | 836 |
| Alternative 12 | |
|---|---|
| Error | 45.05% |
| Cost | 320 |
herbie shell --seed 2023090
(FPCore (x y z)
:name "Statistics.Distribution.CauchyLorentz:$cdensity from math-functions-0.1.5.2"
:precision binary64
:herbie-target
(if (< (* y (+ 1.0 (* z z))) (- INFINITY)) (/ (/ 1.0 y) (* (+ 1.0 (* z z)) x)) (if (< (* y (+ 1.0 (* z z))) 8.680743250567252e+305) (/ (/ 1.0 x) (* (+ 1.0 (* z z)) y)) (/ (/ 1.0 y) (* (+ 1.0 (* z z)) x))))
(/ (/ 1.0 x) (* y (+ 1.0 (* z z)))))