
(FPCore (x y z) :precision binary64 (/ (+ x y) (- 1.0 (/ y z))))
double code(double x, double y, double z) {
return (x + y) / (1.0 - (y / z));
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = (x + y) / (1.0d0 - (y / z))
end function
public static double code(double x, double y, double z) {
return (x + y) / (1.0 - (y / z));
}
def code(x, y, z): return (x + y) / (1.0 - (y / z))
function code(x, y, z) return Float64(Float64(x + y) / Float64(1.0 - Float64(y / z))) end
function tmp = code(x, y, z) tmp = (x + y) / (1.0 - (y / z)); end
code[x_, y_, z_] := N[(N[(x + y), $MachinePrecision] / N[(1.0 - N[(y / z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{x + y}{1 - \frac{y}{z}}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 9 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x y z) :precision binary64 (/ (+ x y) (- 1.0 (/ y z))))
double code(double x, double y, double z) {
return (x + y) / (1.0 - (y / z));
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = (x + y) / (1.0d0 - (y / z))
end function
public static double code(double x, double y, double z) {
return (x + y) / (1.0 - (y / z));
}
def code(x, y, z): return (x + y) / (1.0 - (y / z))
function code(x, y, z) return Float64(Float64(x + y) / Float64(1.0 - Float64(y / z))) end
function tmp = code(x, y, z) tmp = (x + y) / (1.0 - (y / z)); end
code[x_, y_, z_] := N[(N[(x + y), $MachinePrecision] / N[(1.0 - N[(y / z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{x + y}{1 - \frac{y}{z}}
\end{array}
(FPCore (x y z)
:precision binary64
(let* ((t_0 (/ (+ x y) (- 1.0 (/ y z)))))
(if (or (<= t_0 -5e-286) (not (<= t_0 5e-308)))
t_0
(- (- z) (* z (/ x y))))))
double code(double x, double y, double z) {
double t_0 = (x + y) / (1.0 - (y / z));
double tmp;
if ((t_0 <= -5e-286) || !(t_0 <= 5e-308)) {
tmp = t_0;
} else {
tmp = -z - (z * (x / y));
}
return tmp;
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8) :: t_0
real(8) :: tmp
t_0 = (x + y) / (1.0d0 - (y / z))
if ((t_0 <= (-5d-286)) .or. (.not. (t_0 <= 5d-308))) then
tmp = t_0
else
tmp = -z - (z * (x / y))
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double t_0 = (x + y) / (1.0 - (y / z));
double tmp;
if ((t_0 <= -5e-286) || !(t_0 <= 5e-308)) {
tmp = t_0;
} else {
tmp = -z - (z * (x / y));
}
return tmp;
}
def code(x, y, z): t_0 = (x + y) / (1.0 - (y / z)) tmp = 0 if (t_0 <= -5e-286) or not (t_0 <= 5e-308): tmp = t_0 else: tmp = -z - (z * (x / y)) return tmp
function code(x, y, z) t_0 = Float64(Float64(x + y) / Float64(1.0 - Float64(y / z))) tmp = 0.0 if ((t_0 <= -5e-286) || !(t_0 <= 5e-308)) tmp = t_0; else tmp = Float64(Float64(-z) - Float64(z * Float64(x / y))); end return tmp end
function tmp_2 = code(x, y, z) t_0 = (x + y) / (1.0 - (y / z)); tmp = 0.0; if ((t_0 <= -5e-286) || ~((t_0 <= 5e-308))) tmp = t_0; else tmp = -z - (z * (x / y)); end tmp_2 = tmp; end
code[x_, y_, z_] := Block[{t$95$0 = N[(N[(x + y), $MachinePrecision] / N[(1.0 - N[(y / z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, If[Or[LessEqual[t$95$0, -5e-286], N[Not[LessEqual[t$95$0, 5e-308]], $MachinePrecision]], t$95$0, N[((-z) - N[(z * N[(x / y), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \frac{x + y}{1 - \frac{y}{z}}\\
\mathbf{if}\;t_0 \leq -5 \cdot 10^{-286} \lor \neg \left(t_0 \leq 5 \cdot 10^{-308}\right):\\
\;\;\;\;t_0\\
\mathbf{else}:\\
\;\;\;\;\left(-z\right) - z \cdot \frac{x}{y}\\
\end{array}
\end{array}
if (/.f64 (+.f64 x y) (-.f64 1 (/.f64 y z))) < -5.00000000000000037e-286 or 4.99999999999999955e-308 < (/.f64 (+.f64 x y) (-.f64 1 (/.f64 y z))) Initial program 99.8%
if -5.00000000000000037e-286 < (/.f64 (+.f64 x y) (-.f64 1 (/.f64 y z))) < 4.99999999999999955e-308Initial program 10.7%
Taylor expanded in z around 0 97.1%
mul-1-neg97.1%
associate-/l*10.7%
+-commutative10.7%
distribute-neg-frac10.7%
distribute-neg-in10.7%
+-commutative10.7%
sub-neg10.7%
Simplified10.7%
Taylor expanded in y around 0 99.9%
distribute-lft-out99.9%
associate-*r/100.0%
neg-mul-1100.0%
Simplified100.0%
Final simplification99.8%
(FPCore (x y z)
:precision binary64
(let* ((t_0 (- 1.0 (/ y z))) (t_1 (/ x t_0)))
(if (<= y -5.6e+182)
(* z (- -1.0 (/ z y)))
(if (<= y -1.9e+48)
(/ y t_0)
(if (<= y -6.5e-62)
t_1
(if (<= y 1.15e-60) (+ x y) (if (<= y 4.1e+14) t_1 (- z))))))))
double code(double x, double y, double z) {
double t_0 = 1.0 - (y / z);
double t_1 = x / t_0;
double tmp;
if (y <= -5.6e+182) {
tmp = z * (-1.0 - (z / y));
} else if (y <= -1.9e+48) {
tmp = y / t_0;
} else if (y <= -6.5e-62) {
tmp = t_1;
} else if (y <= 1.15e-60) {
tmp = x + y;
} else if (y <= 4.1e+14) {
tmp = t_1;
} else {
tmp = -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
real(8) :: t_0
real(8) :: t_1
real(8) :: tmp
t_0 = 1.0d0 - (y / z)
t_1 = x / t_0
if (y <= (-5.6d+182)) then
tmp = z * ((-1.0d0) - (z / y))
else if (y <= (-1.9d+48)) then
tmp = y / t_0
else if (y <= (-6.5d-62)) then
tmp = t_1
else if (y <= 1.15d-60) then
tmp = x + y
else if (y <= 4.1d+14) then
tmp = t_1
else
tmp = -z
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double t_0 = 1.0 - (y / z);
double t_1 = x / t_0;
double tmp;
if (y <= -5.6e+182) {
tmp = z * (-1.0 - (z / y));
} else if (y <= -1.9e+48) {
tmp = y / t_0;
} else if (y <= -6.5e-62) {
tmp = t_1;
} else if (y <= 1.15e-60) {
tmp = x + y;
} else if (y <= 4.1e+14) {
tmp = t_1;
} else {
tmp = -z;
}
return tmp;
}
def code(x, y, z): t_0 = 1.0 - (y / z) t_1 = x / t_0 tmp = 0 if y <= -5.6e+182: tmp = z * (-1.0 - (z / y)) elif y <= -1.9e+48: tmp = y / t_0 elif y <= -6.5e-62: tmp = t_1 elif y <= 1.15e-60: tmp = x + y elif y <= 4.1e+14: tmp = t_1 else: tmp = -z return tmp
function code(x, y, z) t_0 = Float64(1.0 - Float64(y / z)) t_1 = Float64(x / t_0) tmp = 0.0 if (y <= -5.6e+182) tmp = Float64(z * Float64(-1.0 - Float64(z / y))); elseif (y <= -1.9e+48) tmp = Float64(y / t_0); elseif (y <= -6.5e-62) tmp = t_1; elseif (y <= 1.15e-60) tmp = Float64(x + y); elseif (y <= 4.1e+14) tmp = t_1; else tmp = Float64(-z); end return tmp end
function tmp_2 = code(x, y, z) t_0 = 1.0 - (y / z); t_1 = x / t_0; tmp = 0.0; if (y <= -5.6e+182) tmp = z * (-1.0 - (z / y)); elseif (y <= -1.9e+48) tmp = y / t_0; elseif (y <= -6.5e-62) tmp = t_1; elseif (y <= 1.15e-60) tmp = x + y; elseif (y <= 4.1e+14) tmp = t_1; else tmp = -z; end tmp_2 = tmp; end
code[x_, y_, z_] := Block[{t$95$0 = N[(1.0 - N[(y / z), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$1 = N[(x / t$95$0), $MachinePrecision]}, If[LessEqual[y, -5.6e+182], N[(z * N[(-1.0 - N[(z / y), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[y, -1.9e+48], N[(y / t$95$0), $MachinePrecision], If[LessEqual[y, -6.5e-62], t$95$1, If[LessEqual[y, 1.15e-60], N[(x + y), $MachinePrecision], If[LessEqual[y, 4.1e+14], t$95$1, (-z)]]]]]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := 1 - \frac{y}{z}\\
t_1 := \frac{x}{t_0}\\
\mathbf{if}\;y \leq -5.6 \cdot 10^{+182}:\\
\;\;\;\;z \cdot \left(-1 - \frac{z}{y}\right)\\
\mathbf{elif}\;y \leq -1.9 \cdot 10^{+48}:\\
\;\;\;\;\frac{y}{t_0}\\
\mathbf{elif}\;y \leq -6.5 \cdot 10^{-62}:\\
\;\;\;\;t_1\\
\mathbf{elif}\;y \leq 1.15 \cdot 10^{-60}:\\
\;\;\;\;x + y\\
\mathbf{elif}\;y \leq 4.1 \cdot 10^{+14}:\\
\;\;\;\;t_1\\
\mathbf{else}:\\
\;\;\;\;-z\\
\end{array}
\end{array}
if y < -5.60000000000000013e182Initial program 64.1%
Taylor expanded in y around inf 63.0%
mul-1-neg63.0%
unsub-neg63.0%
mul-1-neg63.0%
associate-/l*63.2%
unpow263.2%
associate-/l*90.6%
Simplified90.6%
neg-mul-190.6%
fma-neg90.6%
div-inv90.6%
clear-num90.6%
distribute-lft-neg-in90.6%
add-sqr-sqrt58.0%
sqrt-unprod62.5%
sqr-neg62.5%
sqrt-unprod29.4%
add-sqr-sqrt84.5%
Applied egg-rr84.5%
fma-udef84.5%
*-commutative84.5%
distribute-lft-out84.5%
Simplified84.5%
Taylor expanded in x around 0 60.6%
*-commutative60.6%
unpow260.6%
associate-*r/85.1%
distribute-lft-out--85.1%
Simplified85.1%
if -5.60000000000000013e182 < y < -1.9e48Initial program 82.4%
Taylor expanded in x around 0 62.0%
if -1.9e48 < y < -6.50000000000000026e-62 or 1.1500000000000001e-60 < y < 4.1e14Initial program 97.0%
Taylor expanded in x around inf 70.5%
if -6.50000000000000026e-62 < y < 1.1500000000000001e-60Initial program 99.9%
Taylor expanded in z around inf 89.1%
if 4.1e14 < y Initial program 70.1%
Taylor expanded in y around inf 57.2%
mul-1-neg57.2%
Simplified57.2%
Final simplification74.6%
(FPCore (x y z)
:precision binary64
(let* ((t_0 (/ x (- 1.0 (/ y z)))))
(if (<= y -2.1e+48)
(* z (- -1.0 (/ z y)))
(if (<= y -2.2e-44)
t_0
(if (<= y 7e-62) (+ x y) (if (<= y 4.1e+14) t_0 (- z)))))))
double code(double x, double y, double z) {
double t_0 = x / (1.0 - (y / z));
double tmp;
if (y <= -2.1e+48) {
tmp = z * (-1.0 - (z / y));
} else if (y <= -2.2e-44) {
tmp = t_0;
} else if (y <= 7e-62) {
tmp = x + y;
} else if (y <= 4.1e+14) {
tmp = t_0;
} else {
tmp = -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
real(8) :: t_0
real(8) :: tmp
t_0 = x / (1.0d0 - (y / z))
if (y <= (-2.1d+48)) then
tmp = z * ((-1.0d0) - (z / y))
else if (y <= (-2.2d-44)) then
tmp = t_0
else if (y <= 7d-62) then
tmp = x + y
else if (y <= 4.1d+14) then
tmp = t_0
else
tmp = -z
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double t_0 = x / (1.0 - (y / z));
double tmp;
if (y <= -2.1e+48) {
tmp = z * (-1.0 - (z / y));
} else if (y <= -2.2e-44) {
tmp = t_0;
} else if (y <= 7e-62) {
tmp = x + y;
} else if (y <= 4.1e+14) {
tmp = t_0;
} else {
tmp = -z;
}
return tmp;
}
def code(x, y, z): t_0 = x / (1.0 - (y / z)) tmp = 0 if y <= -2.1e+48: tmp = z * (-1.0 - (z / y)) elif y <= -2.2e-44: tmp = t_0 elif y <= 7e-62: tmp = x + y elif y <= 4.1e+14: tmp = t_0 else: tmp = -z return tmp
function code(x, y, z) t_0 = Float64(x / Float64(1.0 - Float64(y / z))) tmp = 0.0 if (y <= -2.1e+48) tmp = Float64(z * Float64(-1.0 - Float64(z / y))); elseif (y <= -2.2e-44) tmp = t_0; elseif (y <= 7e-62) tmp = Float64(x + y); elseif (y <= 4.1e+14) tmp = t_0; else tmp = Float64(-z); end return tmp end
function tmp_2 = code(x, y, z) t_0 = x / (1.0 - (y / z)); tmp = 0.0; if (y <= -2.1e+48) tmp = z * (-1.0 - (z / y)); elseif (y <= -2.2e-44) tmp = t_0; elseif (y <= 7e-62) tmp = x + y; elseif (y <= 4.1e+14) tmp = t_0; else tmp = -z; end tmp_2 = tmp; end
code[x_, y_, z_] := Block[{t$95$0 = N[(x / N[(1.0 - N[(y / z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[y, -2.1e+48], N[(z * N[(-1.0 - N[(z / y), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[y, -2.2e-44], t$95$0, If[LessEqual[y, 7e-62], N[(x + y), $MachinePrecision], If[LessEqual[y, 4.1e+14], t$95$0, (-z)]]]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \frac{x}{1 - \frac{y}{z}}\\
\mathbf{if}\;y \leq -2.1 \cdot 10^{+48}:\\
\;\;\;\;z \cdot \left(-1 - \frac{z}{y}\right)\\
\mathbf{elif}\;y \leq -2.2 \cdot 10^{-44}:\\
\;\;\;\;t_0\\
\mathbf{elif}\;y \leq 7 \cdot 10^{-62}:\\
\;\;\;\;x + y\\
\mathbf{elif}\;y \leq 4.1 \cdot 10^{+14}:\\
\;\;\;\;t_0\\
\mathbf{else}:\\
\;\;\;\;-z\\
\end{array}
\end{array}
if y < -2.0999999999999998e48Initial program 73.7%
Taylor expanded in y around inf 67.5%
mul-1-neg67.5%
unsub-neg67.5%
mul-1-neg67.5%
associate-/l*67.7%
unpow267.7%
associate-/l*80.6%
Simplified80.6%
neg-mul-180.6%
fma-neg80.6%
div-inv80.6%
clear-num80.6%
distribute-lft-neg-in80.6%
add-sqr-sqrt51.2%
sqrt-unprod60.5%
sqr-neg60.5%
sqrt-unprod24.8%
add-sqr-sqrt62.9%
Applied egg-rr62.9%
fma-udef62.9%
*-commutative62.9%
distribute-lft-out62.9%
Simplified62.9%
Taylor expanded in x around 0 51.8%
*-commutative51.8%
unpow251.8%
associate-*r/63.4%
distribute-lft-out--63.4%
Simplified63.4%
if -2.0999999999999998e48 < y < -2.20000000000000012e-44 or 7.0000000000000003e-62 < y < 4.1e14Initial program 97.0%
Taylor expanded in x around inf 70.5%
if -2.20000000000000012e-44 < y < 7.0000000000000003e-62Initial program 99.9%
Taylor expanded in z around inf 89.1%
if 4.1e14 < y Initial program 70.1%
Taylor expanded in y around inf 57.2%
mul-1-neg57.2%
Simplified57.2%
Final simplification71.9%
(FPCore (x y z) :precision binary64 (if (or (<= y -4.8e-22) (not (<= y 4.4e-26))) (- (- z) (* z (/ x y))) (+ x y)))
double code(double x, double y, double z) {
double tmp;
if ((y <= -4.8e-22) || !(y <= 4.4e-26)) {
tmp = -z - (z * (x / y));
} else {
tmp = x + y;
}
return tmp;
}
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 ((y <= (-4.8d-22)) .or. (.not. (y <= 4.4d-26))) then
tmp = -z - (z * (x / y))
else
tmp = x + y
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double tmp;
if ((y <= -4.8e-22) || !(y <= 4.4e-26)) {
tmp = -z - (z * (x / y));
} else {
tmp = x + y;
}
return tmp;
}
def code(x, y, z): tmp = 0 if (y <= -4.8e-22) or not (y <= 4.4e-26): tmp = -z - (z * (x / y)) else: tmp = x + y return tmp
function code(x, y, z) tmp = 0.0 if ((y <= -4.8e-22) || !(y <= 4.4e-26)) tmp = Float64(Float64(-z) - Float64(z * Float64(x / y))); else tmp = Float64(x + y); end return tmp end
function tmp_2 = code(x, y, z) tmp = 0.0; if ((y <= -4.8e-22) || ~((y <= 4.4e-26))) tmp = -z - (z * (x / y)); else tmp = x + y; end tmp_2 = tmp; end
code[x_, y_, z_] := If[Or[LessEqual[y, -4.8e-22], N[Not[LessEqual[y, 4.4e-26]], $MachinePrecision]], N[((-z) - N[(z * N[(x / y), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(x + y), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y \leq -4.8 \cdot 10^{-22} \lor \neg \left(y \leq 4.4 \cdot 10^{-26}\right):\\
\;\;\;\;\left(-z\right) - z \cdot \frac{x}{y}\\
\mathbf{else}:\\
\;\;\;\;x + y\\
\end{array}
\end{array}
if y < -4.80000000000000005e-22 or 4.4000000000000002e-26 < y Initial program 75.4%
Taylor expanded in z around 0 64.9%
mul-1-neg64.9%
associate-/l*52.0%
+-commutative52.0%
distribute-neg-frac52.0%
distribute-neg-in52.0%
+-commutative52.0%
sub-neg52.0%
Simplified52.0%
Taylor expanded in y around 0 70.5%
distribute-lft-out70.5%
associate-*r/76.5%
neg-mul-176.5%
Simplified76.5%
if -4.80000000000000005e-22 < y < 4.4000000000000002e-26Initial program 99.9%
Taylor expanded in z around inf 85.7%
Final simplification80.2%
(FPCore (x y z) :precision binary64 (if (<= y -6e+47) (* z (- -1.0 (/ z y))) (if (<= y 1.4e+24) (+ x y) (- z))))
double code(double x, double y, double z) {
double tmp;
if (y <= -6e+47) {
tmp = z * (-1.0 - (z / y));
} else if (y <= 1.4e+24) {
tmp = x + y;
} else {
tmp = -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
real(8) :: tmp
if (y <= (-6d+47)) then
tmp = z * ((-1.0d0) - (z / y))
else if (y <= 1.4d+24) then
tmp = x + y
else
tmp = -z
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double tmp;
if (y <= -6e+47) {
tmp = z * (-1.0 - (z / y));
} else if (y <= 1.4e+24) {
tmp = x + y;
} else {
tmp = -z;
}
return tmp;
}
def code(x, y, z): tmp = 0 if y <= -6e+47: tmp = z * (-1.0 - (z / y)) elif y <= 1.4e+24: tmp = x + y else: tmp = -z return tmp
function code(x, y, z) tmp = 0.0 if (y <= -6e+47) tmp = Float64(z * Float64(-1.0 - Float64(z / y))); elseif (y <= 1.4e+24) tmp = Float64(x + y); else tmp = Float64(-z); end return tmp end
function tmp_2 = code(x, y, z) tmp = 0.0; if (y <= -6e+47) tmp = z * (-1.0 - (z / y)); elseif (y <= 1.4e+24) tmp = x + y; else tmp = -z; end tmp_2 = tmp; end
code[x_, y_, z_] := If[LessEqual[y, -6e+47], N[(z * N[(-1.0 - N[(z / y), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[y, 1.4e+24], N[(x + y), $MachinePrecision], (-z)]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y \leq -6 \cdot 10^{+47}:\\
\;\;\;\;z \cdot \left(-1 - \frac{z}{y}\right)\\
\mathbf{elif}\;y \leq 1.4 \cdot 10^{+24}:\\
\;\;\;\;x + y\\
\mathbf{else}:\\
\;\;\;\;-z\\
\end{array}
\end{array}
if y < -6.0000000000000003e47Initial program 74.1%
Taylor expanded in y around inf 68.0%
mul-1-neg68.0%
unsub-neg68.0%
mul-1-neg68.0%
associate-/l*68.1%
unpow268.1%
associate-/l*80.9%
Simplified80.9%
neg-mul-180.9%
fma-neg80.9%
div-inv80.8%
clear-num80.9%
distribute-lft-neg-in80.9%
add-sqr-sqrt50.5%
sqrt-unprod59.7%
sqr-neg59.7%
sqrt-unprod24.4%
add-sqr-sqrt62.0%
Applied egg-rr62.0%
fma-udef62.0%
*-commutative62.0%
distribute-lft-out62.0%
Simplified62.0%
Taylor expanded in x around 0 51.1%
*-commutative51.1%
unpow251.1%
associate-*r/62.6%
distribute-lft-out--62.6%
Simplified62.6%
if -6.0000000000000003e47 < y < 1.4000000000000001e24Initial program 99.1%
Taylor expanded in z around inf 77.6%
if 1.4000000000000001e24 < y Initial program 69.1%
Taylor expanded in y around inf 59.1%
mul-1-neg59.1%
Simplified59.1%
Final simplification69.1%
(FPCore (x y z) :precision binary64 (if (<= y -7.6e+37) (- z) (if (<= y 5.7e+20) (+ x y) (- z))))
double code(double x, double y, double z) {
double tmp;
if (y <= -7.6e+37) {
tmp = -z;
} else if (y <= 5.7e+20) {
tmp = x + y;
} else {
tmp = -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
real(8) :: tmp
if (y <= (-7.6d+37)) then
tmp = -z
else if (y <= 5.7d+20) then
tmp = x + y
else
tmp = -z
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double tmp;
if (y <= -7.6e+37) {
tmp = -z;
} else if (y <= 5.7e+20) {
tmp = x + y;
} else {
tmp = -z;
}
return tmp;
}
def code(x, y, z): tmp = 0 if y <= -7.6e+37: tmp = -z elif y <= 5.7e+20: tmp = x + y else: tmp = -z return tmp
function code(x, y, z) tmp = 0.0 if (y <= -7.6e+37) tmp = Float64(-z); elseif (y <= 5.7e+20) tmp = Float64(x + y); else tmp = Float64(-z); end return tmp end
function tmp_2 = code(x, y, z) tmp = 0.0; if (y <= -7.6e+37) tmp = -z; elseif (y <= 5.7e+20) tmp = x + y; else tmp = -z; end tmp_2 = tmp; end
code[x_, y_, z_] := If[LessEqual[y, -7.6e+37], (-z), If[LessEqual[y, 5.7e+20], N[(x + y), $MachinePrecision], (-z)]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y \leq -7.6 \cdot 10^{+37}:\\
\;\;\;\;-z\\
\mathbf{elif}\;y \leq 5.7 \cdot 10^{+20}:\\
\;\;\;\;x + y\\
\mathbf{else}:\\
\;\;\;\;-z\\
\end{array}
\end{array}
if y < -7.59999999999999979e37 or 5.7e20 < y Initial program 72.5%
Taylor expanded in y around inf 60.2%
mul-1-neg60.2%
Simplified60.2%
if -7.59999999999999979e37 < y < 5.7e20Initial program 99.1%
Taylor expanded in z around inf 78.6%
Final simplification69.0%
(FPCore (x y z) :precision binary64 (if (<= y -8.2e+30) (- z) (if (<= y 2.8e-24) x (- z))))
double code(double x, double y, double z) {
double tmp;
if (y <= -8.2e+30) {
tmp = -z;
} else if (y <= 2.8e-24) {
tmp = x;
} else {
tmp = -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
real(8) :: tmp
if (y <= (-8.2d+30)) then
tmp = -z
else if (y <= 2.8d-24) then
tmp = x
else
tmp = -z
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double tmp;
if (y <= -8.2e+30) {
tmp = -z;
} else if (y <= 2.8e-24) {
tmp = x;
} else {
tmp = -z;
}
return tmp;
}
def code(x, y, z): tmp = 0 if y <= -8.2e+30: tmp = -z elif y <= 2.8e-24: tmp = x else: tmp = -z return tmp
function code(x, y, z) tmp = 0.0 if (y <= -8.2e+30) tmp = Float64(-z); elseif (y <= 2.8e-24) tmp = x; else tmp = Float64(-z); end return tmp end
function tmp_2 = code(x, y, z) tmp = 0.0; if (y <= -8.2e+30) tmp = -z; elseif (y <= 2.8e-24) tmp = x; else tmp = -z; end tmp_2 = tmp; end
code[x_, y_, z_] := If[LessEqual[y, -8.2e+30], (-z), If[LessEqual[y, 2.8e-24], x, (-z)]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y \leq -8.2 \cdot 10^{+30}:\\
\;\;\;\;-z\\
\mathbf{elif}\;y \leq 2.8 \cdot 10^{-24}:\\
\;\;\;\;x\\
\mathbf{else}:\\
\;\;\;\;-z\\
\end{array}
\end{array}
if y < -8.20000000000000011e30 or 2.8000000000000002e-24 < y Initial program 74.2%
Taylor expanded in y around inf 57.9%
mul-1-neg57.9%
Simplified57.9%
if -8.20000000000000011e30 < y < 2.8000000000000002e-24Initial program 99.0%
Taylor expanded in y around 0 66.7%
Final simplification61.8%
(FPCore (x y z) :precision binary64 (if (<= y -3.15e+43) y (if (<= y 1.95e-69) x y)))
double code(double x, double y, double z) {
double tmp;
if (y <= -3.15e+43) {
tmp = y;
} else if (y <= 1.95e-69) {
tmp = x;
} else {
tmp = y;
}
return tmp;
}
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 (y <= (-3.15d+43)) then
tmp = y
else if (y <= 1.95d-69) then
tmp = x
else
tmp = y
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double tmp;
if (y <= -3.15e+43) {
tmp = y;
} else if (y <= 1.95e-69) {
tmp = x;
} else {
tmp = y;
}
return tmp;
}
def code(x, y, z): tmp = 0 if y <= -3.15e+43: tmp = y elif y <= 1.95e-69: tmp = x else: tmp = y return tmp
function code(x, y, z) tmp = 0.0 if (y <= -3.15e+43) tmp = y; elseif (y <= 1.95e-69) tmp = x; else tmp = y; end return tmp end
function tmp_2 = code(x, y, z) tmp = 0.0; if (y <= -3.15e+43) tmp = y; elseif (y <= 1.95e-69) tmp = x; else tmp = y; end tmp_2 = tmp; end
code[x_, y_, z_] := If[LessEqual[y, -3.15e+43], y, If[LessEqual[y, 1.95e-69], x, y]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y \leq -3.15 \cdot 10^{+43}:\\
\;\;\;\;y\\
\mathbf{elif}\;y \leq 1.95 \cdot 10^{-69}:\\
\;\;\;\;x\\
\mathbf{else}:\\
\;\;\;\;y\\
\end{array}
\end{array}
if y < -3.1499999999999999e43 or 1.9499999999999999e-69 < y Initial program 75.4%
Taylor expanded in x around 0 53.5%
Taylor expanded in y around 0 17.3%
if -3.1499999999999999e43 < y < 1.9499999999999999e-69Initial program 99.0%
Taylor expanded in y around 0 69.9%
Final simplification39.1%
(FPCore (x y z) :precision binary64 x)
double code(double x, double y, double z) {
return x;
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = x
end function
public static double code(double x, double y, double z) {
return x;
}
def code(x, y, z): return x
function code(x, y, z) return x end
function tmp = code(x, y, z) tmp = x; end
code[x_, y_, z_] := x
\begin{array}{l}
\\
x
\end{array}
Initial program 85.2%
Taylor expanded in y around 0 34.3%
Final simplification34.3%
(FPCore (x y z)
:precision binary64
(let* ((t_0 (* (/ (+ y x) (- y)) z)))
(if (< y -3.7429310762689856e+171)
t_0
(if (< y 3.5534662456086734e+168) (/ (+ x y) (- 1.0 (/ y z))) t_0))))
double code(double x, double y, double z) {
double t_0 = ((y + x) / -y) * z;
double tmp;
if (y < -3.7429310762689856e+171) {
tmp = t_0;
} else if (y < 3.5534662456086734e+168) {
tmp = (x + y) / (1.0 - (y / z));
} else {
tmp = t_0;
}
return tmp;
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8) :: t_0
real(8) :: tmp
t_0 = ((y + x) / -y) * z
if (y < (-3.7429310762689856d+171)) then
tmp = t_0
else if (y < 3.5534662456086734d+168) then
tmp = (x + y) / (1.0d0 - (y / z))
else
tmp = t_0
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double t_0 = ((y + x) / -y) * z;
double tmp;
if (y < -3.7429310762689856e+171) {
tmp = t_0;
} else if (y < 3.5534662456086734e+168) {
tmp = (x + y) / (1.0 - (y / z));
} else {
tmp = t_0;
}
return tmp;
}
def code(x, y, z): t_0 = ((y + x) / -y) * z tmp = 0 if y < -3.7429310762689856e+171: tmp = t_0 elif y < 3.5534662456086734e+168: tmp = (x + y) / (1.0 - (y / z)) else: tmp = t_0 return tmp
function code(x, y, z) t_0 = Float64(Float64(Float64(y + x) / Float64(-y)) * z) tmp = 0.0 if (y < -3.7429310762689856e+171) tmp = t_0; elseif (y < 3.5534662456086734e+168) tmp = Float64(Float64(x + y) / Float64(1.0 - Float64(y / z))); else tmp = t_0; end return tmp end
function tmp_2 = code(x, y, z) t_0 = ((y + x) / -y) * z; tmp = 0.0; if (y < -3.7429310762689856e+171) tmp = t_0; elseif (y < 3.5534662456086734e+168) tmp = (x + y) / (1.0 - (y / z)); else tmp = t_0; end tmp_2 = tmp; end
code[x_, y_, z_] := Block[{t$95$0 = N[(N[(N[(y + x), $MachinePrecision] / (-y)), $MachinePrecision] * z), $MachinePrecision]}, If[Less[y, -3.7429310762689856e+171], t$95$0, If[Less[y, 3.5534662456086734e+168], N[(N[(x + y), $MachinePrecision] / N[(1.0 - N[(y / z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], t$95$0]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \frac{y + x}{-y} \cdot z\\
\mathbf{if}\;y < -3.7429310762689856 \cdot 10^{+171}:\\
\;\;\;\;t_0\\
\mathbf{elif}\;y < 3.5534662456086734 \cdot 10^{+168}:\\
\;\;\;\;\frac{x + y}{1 - \frac{y}{z}}\\
\mathbf{else}:\\
\;\;\;\;t_0\\
\end{array}
\end{array}
herbie shell --seed 2023221
(FPCore (x y z)
:name "Graphics.Rendering.Chart.Backend.Diagrams:calcFontMetrics from Chart-diagrams-1.5.1, A"
:precision binary64
:herbie-target
(if (< y -3.7429310762689856e+171) (* (/ (+ y x) (- y)) z) (if (< y 3.5534662456086734e+168) (/ (+ x y) (- 1.0 (/ y z))) (* (/ (+ y x) (- y)) z)))
(/ (+ x y) (- 1.0 (/ y z))))