Average Error: 10.5 → 0.5
Time: 4.9s
Precision: binary64
Cost: 840
\[\frac{x + y \cdot \left(z - x\right)}{z} \]
\[\begin{array}{l} t_0 := y - \frac{x}{\frac{z}{y + -1}}\\ \mathbf{if}\;z \leq -1 \cdot 10^{+88}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;z \leq 1.8 \cdot 10^{-88}:\\ \;\;\;\;y + \frac{x - x \cdot y}{z}\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
(FPCore (x y z) :precision binary64 (/ (+ x (* y (- z x))) z))
(FPCore (x y z)
 :precision binary64
 (let* ((t_0 (- y (/ x (/ z (+ y -1.0))))))
   (if (<= z -1e+88) t_0 (if (<= z 1.8e-88) (+ y (/ (- x (* x y)) z)) t_0))))
double code(double x, double y, double z) {
	return (x + (y * (z - x))) / z;
}
double code(double x, double y, double z) {
	double t_0 = y - (x / (z / (y + -1.0)));
	double tmp;
	if (z <= -1e+88) {
		tmp = t_0;
	} else if (z <= 1.8e-88) {
		tmp = y + ((x - (x * 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
    code = (x + (y * (z - x))) / 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) :: t_0
    real(8) :: tmp
    t_0 = y - (x / (z / (y + (-1.0d0))))
    if (z <= (-1d+88)) then
        tmp = t_0
    else if (z <= 1.8d-88) then
        tmp = y + ((x - (x * y)) / z)
    else
        tmp = t_0
    end if
    code = tmp
end function
public static double code(double x, double y, double z) {
	return (x + (y * (z - x))) / z;
}
public static double code(double x, double y, double z) {
	double t_0 = y - (x / (z / (y + -1.0)));
	double tmp;
	if (z <= -1e+88) {
		tmp = t_0;
	} else if (z <= 1.8e-88) {
		tmp = y + ((x - (x * y)) / z);
	} else {
		tmp = t_0;
	}
	return tmp;
}
def code(x, y, z):
	return (x + (y * (z - x))) / z
def code(x, y, z):
	t_0 = y - (x / (z / (y + -1.0)))
	tmp = 0
	if z <= -1e+88:
		tmp = t_0
	elif z <= 1.8e-88:
		tmp = y + ((x - (x * y)) / z)
	else:
		tmp = t_0
	return tmp
function code(x, y, z)
	return Float64(Float64(x + Float64(y * Float64(z - x))) / z)
end
function code(x, y, z)
	t_0 = Float64(y - Float64(x / Float64(z / Float64(y + -1.0))))
	tmp = 0.0
	if (z <= -1e+88)
		tmp = t_0;
	elseif (z <= 1.8e-88)
		tmp = Float64(y + Float64(Float64(x - Float64(x * y)) / z));
	else
		tmp = t_0;
	end
	return tmp
end
function tmp = code(x, y, z)
	tmp = (x + (y * (z - x))) / z;
end
function tmp_2 = code(x, y, z)
	t_0 = y - (x / (z / (y + -1.0)));
	tmp = 0.0;
	if (z <= -1e+88)
		tmp = t_0;
	elseif (z <= 1.8e-88)
		tmp = y + ((x - (x * y)) / z);
	else
		tmp = t_0;
	end
	tmp_2 = tmp;
end
code[x_, y_, z_] := N[(N[(x + N[(y * N[(z - x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / z), $MachinePrecision]
code[x_, y_, z_] := Block[{t$95$0 = N[(y - N[(x / N[(z / N[(y + -1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[z, -1e+88], t$95$0, If[LessEqual[z, 1.8e-88], N[(y + N[(N[(x - N[(x * y), $MachinePrecision]), $MachinePrecision] / z), $MachinePrecision]), $MachinePrecision], t$95$0]]]
\frac{x + y \cdot \left(z - x\right)}{z}
\begin{array}{l}
t_0 := y - \frac{x}{\frac{z}{y + -1}}\\
\mathbf{if}\;z \leq -1 \cdot 10^{+88}:\\
\;\;\;\;t_0\\

\mathbf{elif}\;z \leq 1.8 \cdot 10^{-88}:\\
\;\;\;\;y + \frac{x - x \cdot y}{z}\\

\mathbf{else}:\\
\;\;\;\;t_0\\


\end{array}

Error

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original10.5
Target0.0
Herbie0.5
\[\left(y + \frac{x}{z}\right) - \frac{y}{\frac{z}{x}} \]

Derivation

  1. Split input into 2 regimes
  2. if z < -9.99999999999999959e87 or 1.8e-88 < z

    1. Initial program 16.7

      \[\frac{x + y \cdot \left(z - x\right)}{z} \]
    2. Taylor expanded in y around 0 0.0

      \[\leadsto \color{blue}{\left(1 - \frac{x}{z}\right) \cdot y + \frac{x}{z}} \]
    3. Taylor expanded in z around -inf 5.6

      \[\leadsto \color{blue}{y + -1 \cdot \frac{y \cdot x + -1 \cdot x}{z}} \]
    4. Simplified0.3

      \[\leadsto \color{blue}{y - \frac{x}{\frac{z}{y + -1}}} \]
      Proof
      (-.f64 y (/.f64 x (/.f64 z (+.f64 y -1)))): 0 points increase in error, 0 points decrease in error
      (-.f64 y (Rewrite<= associate-/l*_binary64 (/.f64 (*.f64 x (+.f64 y -1)) z))): 19 points increase in error, 15 points decrease in error
      (-.f64 y (/.f64 (Rewrite<= distribute-rgt-out_binary64 (+.f64 (*.f64 y x) (*.f64 -1 x))) z)): 1 points increase in error, 3 points decrease in error
      (Rewrite<= unsub-neg_binary64 (+.f64 y (neg.f64 (/.f64 (+.f64 (*.f64 y x) (*.f64 -1 x)) z)))): 0 points increase in error, 0 points decrease in error
      (+.f64 y (Rewrite<= mul-1-neg_binary64 (*.f64 -1 (/.f64 (+.f64 (*.f64 y x) (*.f64 -1 x)) z)))): 0 points increase in error, 0 points decrease in error

    if -9.99999999999999959e87 < z < 1.8e-88

    1. Initial program 1.3

      \[\frac{x + y \cdot \left(z - x\right)}{z} \]
    2. Taylor expanded in y around 0 0.1

      \[\leadsto \color{blue}{\left(1 - \frac{x}{z}\right) \cdot y + \frac{x}{z}} \]
    3. Taylor expanded in x around 0 8.7

      \[\leadsto \color{blue}{\left(-1 \cdot \frac{y}{z} + \frac{1}{z}\right) \cdot x + y} \]
    4. Simplified0.8

      \[\leadsto \color{blue}{y + \frac{x - y \cdot x}{z}} \]
      Proof
      (+.f64 y (/.f64 (-.f64 x (*.f64 y x)) z)): 0 points increase in error, 0 points decrease in error
      (+.f64 y (Rewrite=> div-sub_binary64 (-.f64 (/.f64 x z) (/.f64 (*.f64 y x) z)))): 2 points increase in error, 1 points decrease in error
      (Rewrite<= associate--l+_binary64 (-.f64 (+.f64 y (/.f64 x z)) (/.f64 (*.f64 y x) z))): 0 points increase in error, 0 points decrease in error
      (Rewrite<= unsub-neg_binary64 (+.f64 (+.f64 y (/.f64 x z)) (neg.f64 (/.f64 (*.f64 y x) z)))): 0 points increase in error, 0 points decrease in error
      (+.f64 (+.f64 y (/.f64 x z)) (neg.f64 (Rewrite<= associate-*r/_binary64 (*.f64 y (/.f64 x z))))): 3 points increase in error, 17 points decrease in error
      (+.f64 (+.f64 y (/.f64 x z)) (Rewrite<= distribute-rgt-neg-out_binary64 (*.f64 y (neg.f64 (/.f64 x z))))): 0 points increase in error, 0 points decrease in error
      (+.f64 (+.f64 y (/.f64 x z)) (*.f64 y (Rewrite<= distribute-frac-neg_binary64 (/.f64 (neg.f64 x) z)))): 0 points increase in error, 0 points decrease in error
      (Rewrite<= +-commutative_binary64 (+.f64 (*.f64 y (/.f64 (neg.f64 x) z)) (+.f64 y (/.f64 x z)))): 0 points increase in error, 0 points decrease in error
      (+.f64 (*.f64 y (/.f64 (neg.f64 x) z)) (Rewrite=> +-commutative_binary64 (+.f64 (/.f64 x z) y))): 0 points increase in error, 0 points decrease in error
      (Rewrite=> associate-+r+_binary64 (+.f64 (+.f64 (*.f64 y (/.f64 (neg.f64 x) z)) (/.f64 x z)) y)): 0 points increase in error, 0 points decrease in error
      (+.f64 (+.f64 (Rewrite=> *-commutative_binary64 (*.f64 (/.f64 (neg.f64 x) z) y)) (/.f64 x z)) y): 0 points increase in error, 0 points decrease in error
      (+.f64 (+.f64 (Rewrite<= associate-/r/_binary64 (/.f64 (neg.f64 x) (/.f64 z y))) (/.f64 x z)) y): 15 points increase in error, 2 points decrease in error
      (+.f64 (+.f64 (/.f64 (Rewrite=> neg-mul-1_binary64 (*.f64 -1 x)) (/.f64 z y)) (/.f64 x z)) y): 0 points increase in error, 0 points decrease in error
      (+.f64 (+.f64 (Rewrite<= associate-*l/_binary64 (*.f64 (/.f64 -1 (/.f64 z y)) x)) (/.f64 x z)) y): 8 points increase in error, 3 points decrease in error
      (+.f64 (+.f64 (*.f64 (Rewrite<= associate-/l*_binary64 (/.f64 (*.f64 -1 y) z)) x) (/.f64 x z)) y): 3 points increase in error, 6 points decrease in error
      (+.f64 (+.f64 (*.f64 (Rewrite<= associate-*r/_binary64 (*.f64 -1 (/.f64 y z))) x) (/.f64 x z)) y): 0 points increase in error, 0 points decrease in error
      (+.f64 (+.f64 (*.f64 (*.f64 -1 (/.f64 y z)) x) (/.f64 (Rewrite<= *-lft-identity_binary64 (*.f64 1 x)) z)) y): 0 points increase in error, 0 points decrease in error
      (+.f64 (+.f64 (*.f64 (*.f64 -1 (/.f64 y z)) x) (Rewrite<= associate-*l/_binary64 (*.f64 (/.f64 1 z) x))) y): 28 points increase in error, 2 points decrease in error
      (+.f64 (+.f64 (*.f64 (*.f64 -1 (/.f64 y z)) x) (*.f64 (/.f64 (Rewrite<= metadata-eval (*.f64 -1 -1)) z) x)) y): 0 points increase in error, 0 points decrease in error
      (+.f64 (+.f64 (*.f64 (*.f64 -1 (/.f64 y z)) x) (*.f64 (Rewrite<= associate-*r/_binary64 (*.f64 -1 (/.f64 -1 z))) x)) y): 0 points increase in error, 0 points decrease in error
      (+.f64 (+.f64 (*.f64 (*.f64 -1 (/.f64 y z)) x) (*.f64 (*.f64 -1 (/.f64 (Rewrite<= metadata-eval (neg.f64 1)) z)) x)) y): 0 points increase in error, 0 points decrease in error
      (+.f64 (+.f64 (*.f64 (*.f64 -1 (/.f64 y z)) x) (*.f64 (*.f64 -1 (Rewrite<= distribute-neg-frac_binary64 (neg.f64 (/.f64 1 z)))) x)) y): 0 points increase in error, 0 points decrease in error
      (+.f64 (Rewrite<= distribute-rgt-in_binary64 (*.f64 x (+.f64 (*.f64 -1 (/.f64 y z)) (*.f64 -1 (neg.f64 (/.f64 1 z)))))) y): 1 points increase in error, 1 points decrease in error
      (+.f64 (*.f64 x (Rewrite<= distribute-lft-in_binary64 (*.f64 -1 (+.f64 (/.f64 y z) (neg.f64 (/.f64 1 z)))))) y): 0 points increase in error, 0 points decrease in error
      (+.f64 (*.f64 x (*.f64 -1 (Rewrite<= sub-neg_binary64 (-.f64 (/.f64 y z) (/.f64 1 z))))) y): 0 points increase in error, 0 points decrease in error
      (+.f64 (Rewrite<= *-commutative_binary64 (*.f64 (*.f64 -1 (-.f64 (/.f64 y z) (/.f64 1 z))) x)) y): 0 points increase in error, 0 points decrease in error
      (Rewrite=> fma-def_binary64 (fma.f64 (*.f64 -1 (-.f64 (/.f64 y z) (/.f64 1 z))) x y)): 0 points increase in error, 1 points decrease in error
      (fma.f64 (*.f64 -1 (Rewrite=> sub-neg_binary64 (+.f64 (/.f64 y z) (neg.f64 (/.f64 1 z))))) x y): 0 points increase in error, 0 points decrease in error
      (fma.f64 (Rewrite=> distribute-lft-in_binary64 (+.f64 (*.f64 -1 (/.f64 y z)) (*.f64 -1 (neg.f64 (/.f64 1 z))))) x y): 0 points increase in error, 0 points decrease in error
      (fma.f64 (+.f64 (*.f64 -1 (/.f64 y z)) (*.f64 -1 (Rewrite=> distribute-neg-frac_binary64 (/.f64 (neg.f64 1) z)))) x y): 0 points increase in error, 0 points decrease in error
      (fma.f64 (+.f64 (*.f64 -1 (/.f64 y z)) (*.f64 -1 (/.f64 (Rewrite=> metadata-eval -1) z))) x y): 0 points increase in error, 0 points decrease in error
      (fma.f64 (+.f64 (*.f64 -1 (/.f64 y z)) (Rewrite=> associate-*r/_binary64 (/.f64 (*.f64 -1 -1) z))) x y): 0 points increase in error, 0 points decrease in error
      (fma.f64 (+.f64 (*.f64 -1 (/.f64 y z)) (/.f64 (Rewrite=> metadata-eval 1) z)) x y): 0 points increase in error, 0 points decrease in error
      (Rewrite<= fma-def_binary64 (+.f64 (*.f64 (+.f64 (*.f64 -1 (/.f64 y z)) (/.f64 1 z)) x) y)): 1 points increase in error, 0 points decrease in error
  3. Recombined 2 regimes into one program.
  4. Final simplification0.5

    \[\leadsto \begin{array}{l} \mathbf{if}\;z \leq -1 \cdot 10^{+88}:\\ \;\;\;\;y - \frac{x}{\frac{z}{y + -1}}\\ \mathbf{elif}\;z \leq 1.8 \cdot 10^{-88}:\\ \;\;\;\;y + \frac{x - x \cdot y}{z}\\ \mathbf{else}:\\ \;\;\;\;y - \frac{x}{\frac{z}{y + -1}}\\ \end{array} \]

Alternatives

Alternative 1
Error0.6
Cost712
\[\begin{array}{l} t_0 := \left(1 - \frac{x}{z}\right) \cdot y\\ \mathbf{if}\;y \leq -3200:\\ \;\;\;\;t_0\\ \mathbf{elif}\;y \leq 1:\\ \;\;\;\;\frac{x}{z} + y\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 2
Error2.1
Cost708
\[\begin{array}{l} \mathbf{if}\;y \leq -5 \cdot 10^{+57}:\\ \;\;\;\;\left(1 - \frac{x}{z}\right) \cdot y\\ \mathbf{else}:\\ \;\;\;\;y + \frac{x - x \cdot y}{z}\\ \end{array} \]
Alternative 3
Error0.1
Cost704
\[\frac{x}{z} + \left(1 - \frac{x}{z}\right) \cdot y \]
Alternative 4
Error10.3
Cost648
\[\begin{array}{l} \mathbf{if}\;y \leq -9 \cdot 10^{+126}:\\ \;\;\;\;y\\ \mathbf{elif}\;y \leq -2 \cdot 10^{+23}:\\ \;\;\;\;\frac{x}{z} \cdot \left(-y\right)\\ \mathbf{else}:\\ \;\;\;\;\frac{x}{z} + y\\ \end{array} \]
Alternative 5
Error20.3
Cost456
\[\begin{array}{l} \mathbf{if}\;y \leq -5 \cdot 10^{-22}:\\ \;\;\;\;y\\ \mathbf{elif}\;y \leq 9.8 \cdot 10^{-11}:\\ \;\;\;\;\frac{x}{z}\\ \mathbf{else}:\\ \;\;\;\;y\\ \end{array} \]
Alternative 6
Error8.9
Cost320
\[\frac{x}{z} + y \]
Alternative 7
Error31.5
Cost64
\[y \]

Error

Reproduce

herbie shell --seed 2022325 
(FPCore (x y z)
  :name "Diagrams.Backend.Rasterific:rasterificRadialGradient from diagrams-rasterific-1.3.1.3"
  :precision binary64

  :herbie-target
  (- (+ y (/ x z)) (/ y (/ z x)))

  (/ (+ x (* y (- z x))) z))