Average Error: 37.0 → 0.3
Time: 12.4s
Precision: binary64
Cost: 39168
\[\sin \left(x + \varepsilon\right) - \sin x \]
\[\sin \varepsilon \cdot \cos x + \frac{{\sin \varepsilon}^{2}}{-1 - \cos \varepsilon} \cdot \sin x \]
(FPCore (x eps) :precision binary64 (- (sin (+ x eps)) (sin x)))
(FPCore (x eps)
 :precision binary64
 (+
  (* (sin eps) (cos x))
  (* (/ (pow (sin eps) 2.0) (- -1.0 (cos eps))) (sin x))))
double code(double x, double eps) {
	return sin((x + eps)) - sin(x);
}
double code(double x, double eps) {
	return (sin(eps) * cos(x)) + ((pow(sin(eps), 2.0) / (-1.0 - cos(eps))) * sin(x));
}
real(8) function code(x, eps)
    real(8), intent (in) :: x
    real(8), intent (in) :: eps
    code = sin((x + eps)) - sin(x)
end function
real(8) function code(x, eps)
    real(8), intent (in) :: x
    real(8), intent (in) :: eps
    code = (sin(eps) * cos(x)) + (((sin(eps) ** 2.0d0) / ((-1.0d0) - cos(eps))) * sin(x))
end function
public static double code(double x, double eps) {
	return Math.sin((x + eps)) - Math.sin(x);
}
public static double code(double x, double eps) {
	return (Math.sin(eps) * Math.cos(x)) + ((Math.pow(Math.sin(eps), 2.0) / (-1.0 - Math.cos(eps))) * Math.sin(x));
}
def code(x, eps):
	return math.sin((x + eps)) - math.sin(x)
def code(x, eps):
	return (math.sin(eps) * math.cos(x)) + ((math.pow(math.sin(eps), 2.0) / (-1.0 - math.cos(eps))) * math.sin(x))
function code(x, eps)
	return Float64(sin(Float64(x + eps)) - sin(x))
end
function code(x, eps)
	return Float64(Float64(sin(eps) * cos(x)) + Float64(Float64((sin(eps) ^ 2.0) / Float64(-1.0 - cos(eps))) * sin(x)))
end
function tmp = code(x, eps)
	tmp = sin((x + eps)) - sin(x);
end
function tmp = code(x, eps)
	tmp = (sin(eps) * cos(x)) + (((sin(eps) ^ 2.0) / (-1.0 - cos(eps))) * sin(x));
end
code[x_, eps_] := N[(N[Sin[N[(x + eps), $MachinePrecision]], $MachinePrecision] - N[Sin[x], $MachinePrecision]), $MachinePrecision]
code[x_, eps_] := N[(N[(N[Sin[eps], $MachinePrecision] * N[Cos[x], $MachinePrecision]), $MachinePrecision] + N[(N[(N[Power[N[Sin[eps], $MachinePrecision], 2.0], $MachinePrecision] / N[(-1.0 - N[Cos[eps], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[Sin[x], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\sin \left(x + \varepsilon\right) - \sin x
\sin \varepsilon \cdot \cos x + \frac{{\sin \varepsilon}^{2}}{-1 - \cos \varepsilon} \cdot \sin x

Error

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original37.0
Target15.0
Herbie0.3
\[2 \cdot \left(\cos \left(x + \frac{\varepsilon}{2}\right) \cdot \sin \left(\frac{\varepsilon}{2}\right)\right) \]

Derivation

  1. Initial program 37.0

    \[\sin \left(x + \varepsilon\right) - \sin x \]
  2. Applied egg-rr21.9

    \[\leadsto \color{blue}{\sin x \cdot \cos \varepsilon + \left(\cos x \cdot \sin \varepsilon - \sin x\right)} \]
  3. Simplified0.4

    \[\leadsto \color{blue}{\sin \varepsilon \cdot \cos x + \sin x \cdot \left(\cos \varepsilon + -1\right)} \]
    Proof
    (+.f64 (*.f64 (sin.f64 eps) (cos.f64 x)) (*.f64 (sin.f64 x) (+.f64 (cos.f64 eps) -1))): 0 points increase in error, 0 points decrease in error
    (+.f64 (Rewrite<= *-commutative_binary64 (*.f64 (cos.f64 x) (sin.f64 eps))) (*.f64 (sin.f64 x) (+.f64 (cos.f64 eps) -1))): 0 points increase in error, 0 points decrease in error
    (+.f64 (*.f64 (cos.f64 x) (sin.f64 eps)) (*.f64 (sin.f64 x) (Rewrite=> +-commutative_binary64 (+.f64 -1 (cos.f64 eps))))): 0 points increase in error, 0 points decrease in error
    (+.f64 (*.f64 (cos.f64 x) (sin.f64 eps)) (Rewrite<= distribute-rgt-out_binary64 (+.f64 (*.f64 -1 (sin.f64 x)) (*.f64 (cos.f64 eps) (sin.f64 x))))): 11 points increase in error, 7 points decrease in error
    (+.f64 (*.f64 (cos.f64 x) (sin.f64 eps)) (+.f64 (Rewrite<= neg-mul-1_binary64 (neg.f64 (sin.f64 x))) (*.f64 (cos.f64 eps) (sin.f64 x)))): 0 points increase in error, 0 points decrease in error
    (+.f64 (*.f64 (cos.f64 x) (sin.f64 eps)) (+.f64 (neg.f64 (sin.f64 x)) (Rewrite<= *-commutative_binary64 (*.f64 (sin.f64 x) (cos.f64 eps))))): 0 points increase in error, 0 points decrease in error
    (Rewrite<= associate-+l+_binary64 (+.f64 (+.f64 (*.f64 (cos.f64 x) (sin.f64 eps)) (neg.f64 (sin.f64 x))) (*.f64 (sin.f64 x) (cos.f64 eps)))): 110 points increase in error, 12 points decrease in error
    (+.f64 (Rewrite<= sub-neg_binary64 (-.f64 (*.f64 (cos.f64 x) (sin.f64 eps)) (sin.f64 x))) (*.f64 (sin.f64 x) (cos.f64 eps))): 0 points increase in error, 0 points decrease in error
    (Rewrite<= +-commutative_binary64 (+.f64 (*.f64 (sin.f64 x) (cos.f64 eps)) (-.f64 (*.f64 (cos.f64 x) (sin.f64 eps)) (sin.f64 x)))): 0 points increase in error, 0 points decrease in error
  4. Applied egg-rr0.3

    \[\leadsto \sin \varepsilon \cdot \cos x + \color{blue}{\frac{\left(-{\sin \varepsilon}^{2}\right) \cdot \sin x}{\cos \varepsilon + 1}} \]
  5. Simplified0.3

    \[\leadsto \sin \varepsilon \cdot \cos x + \color{blue}{\frac{{\sin \varepsilon}^{2}}{-1 - \cos \varepsilon} \cdot \sin x} \]
    Proof
    (*.f64 (/.f64 (pow.f64 (sin.f64 eps) 2) (-.f64 -1 (cos.f64 eps))) (sin.f64 x)): 0 points increase in error, 0 points decrease in error
    (*.f64 (/.f64 (Rewrite<= remove-double-neg_binary64 (neg.f64 (neg.f64 (pow.f64 (sin.f64 eps) 2)))) (-.f64 -1 (cos.f64 eps))) (sin.f64 x)): 0 points increase in error, 0 points decrease in error
    (*.f64 (/.f64 (neg.f64 (neg.f64 (pow.f64 (sin.f64 eps) 2))) (Rewrite<= unsub-neg_binary64 (+.f64 -1 (neg.f64 (cos.f64 eps))))) (sin.f64 x)): 0 points increase in error, 0 points decrease in error
    (*.f64 (/.f64 (neg.f64 (neg.f64 (pow.f64 (sin.f64 eps) 2))) (+.f64 (Rewrite<= metadata-eval (neg.f64 1)) (neg.f64 (cos.f64 eps)))) (sin.f64 x)): 0 points increase in error, 0 points decrease in error
    (*.f64 (/.f64 (neg.f64 (neg.f64 (pow.f64 (sin.f64 eps) 2))) (Rewrite<= distribute-neg-in_binary64 (neg.f64 (+.f64 1 (cos.f64 eps))))) (sin.f64 x)): 0 points increase in error, 0 points decrease in error
    (*.f64 (/.f64 (neg.f64 (neg.f64 (pow.f64 (sin.f64 eps) 2))) (neg.f64 (Rewrite<= +-commutative_binary64 (+.f64 (cos.f64 eps) 1)))) (sin.f64 x)): 0 points increase in error, 0 points decrease in error
    (*.f64 (/.f64 (Rewrite=> neg-mul-1_binary64 (*.f64 -1 (neg.f64 (pow.f64 (sin.f64 eps) 2)))) (neg.f64 (+.f64 (cos.f64 eps) 1))) (sin.f64 x)): 0 points increase in error, 0 points decrease in error
    (*.f64 (/.f64 (*.f64 -1 (neg.f64 (pow.f64 (sin.f64 eps) 2))) (Rewrite=> neg-mul-1_binary64 (*.f64 -1 (+.f64 (cos.f64 eps) 1)))) (sin.f64 x)): 0 points increase in error, 0 points decrease in error
    (*.f64 (Rewrite=> times-frac_binary64 (*.f64 (/.f64 -1 -1) (/.f64 (neg.f64 (pow.f64 (sin.f64 eps) 2)) (+.f64 (cos.f64 eps) 1)))) (sin.f64 x)): 0 points increase in error, 0 points decrease in error
    (*.f64 (*.f64 (Rewrite=> metadata-eval 1) (/.f64 (neg.f64 (pow.f64 (sin.f64 eps) 2)) (+.f64 (cos.f64 eps) 1))) (sin.f64 x)): 0 points increase in error, 0 points decrease in error
    (*.f64 (Rewrite=> *-lft-identity_binary64 (/.f64 (neg.f64 (pow.f64 (sin.f64 eps) 2)) (+.f64 (cos.f64 eps) 1))) (sin.f64 x)): 0 points increase in error, 0 points decrease in error
    (Rewrite<= associate-/r/_binary64 (/.f64 (neg.f64 (pow.f64 (sin.f64 eps) 2)) (/.f64 (+.f64 (cos.f64 eps) 1) (sin.f64 x)))): 20 points increase in error, 32 points decrease in error
    (Rewrite<= associate-/l*_binary64 (/.f64 (*.f64 (neg.f64 (pow.f64 (sin.f64 eps) 2)) (sin.f64 x)) (+.f64 (cos.f64 eps) 1))): 36 points increase in error, 26 points decrease in error
  6. Final simplification0.3

    \[\leadsto \sin \varepsilon \cdot \cos x + \frac{{\sin \varepsilon}^{2}}{-1 - \cos \varepsilon} \cdot \sin x \]

Alternatives

Alternative 1
Error0.4
Cost38848
\[\mathsf{fma}\left(\sin \varepsilon, \cos x, \cos \varepsilon \cdot \sin x - \sin x\right) \]
Alternative 2
Error0.4
Cost32448
\[\mathsf{fma}\left(\sin \varepsilon, \cos x, \sin x \cdot \left(-1 + \cos \varepsilon\right)\right) \]
Alternative 3
Error0.4
Cost26304
\[\sin \varepsilon \cdot \cos x + \frac{\sin x}{\frac{1}{-1 + \cos \varepsilon}} \]
Alternative 4
Error0.4
Cost26176
\[\sin \varepsilon \cdot \cos x - \sin x \cdot \left(1 - \cos \varepsilon\right) \]
Alternative 5
Error14.5
Cost13768
\[\begin{array}{l} t_0 := \sin \varepsilon - \sin x\\ \mathbf{if}\;\varepsilon \leq -0.29:\\ \;\;\;\;t_0\\ \mathbf{elif}\;\varepsilon \leq 7 \cdot 10^{-6}:\\ \;\;\;\;\left(\varepsilon \cdot \varepsilon\right) \cdot \left(\sin x \cdot -0.5\right) + \varepsilon \cdot \cos x\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 6
Error14.5
Cost13640
\[\begin{array}{l} t_0 := \sin \varepsilon - \sin x\\ \mathbf{if}\;\varepsilon \leq -0.29:\\ \;\;\;\;t_0\\ \mathbf{elif}\;\varepsilon \leq 7 \cdot 10^{-6}:\\ \;\;\;\;\varepsilon \cdot \left(\cos x + -0.5 \cdot \left(\varepsilon \cdot \sin x\right)\right)\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 7
Error15.0
Cost13632
\[\cos \left(0.5 \cdot \left(x + \left(\varepsilon + x\right)\right)\right) \cdot \left(2 \cdot \sin \left(\varepsilon \cdot 0.5\right)\right) \]
Alternative 8
Error15.0
Cost13632
\[\left(2 \cdot \cos \left(0.5 \cdot \left(\varepsilon + \left(x + x\right)\right)\right)\right) \cdot \sin \left(\varepsilon \cdot 0.5\right) \]
Alternative 9
Error14.6
Cost13256
\[\begin{array}{l} t_0 := \sin \varepsilon - \sin x\\ \mathbf{if}\;\varepsilon \leq -0.29:\\ \;\;\;\;t_0\\ \mathbf{elif}\;\varepsilon \leq 7 \cdot 10^{-6}:\\ \;\;\;\;\varepsilon \cdot \cos x\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 10
Error15.0
Cost6856
\[\begin{array}{l} \mathbf{if}\;\varepsilon \leq -4.2 \cdot 10^{-5}:\\ \;\;\;\;\sin \varepsilon\\ \mathbf{elif}\;\varepsilon \leq 5.5 \cdot 10^{-6}:\\ \;\;\;\;\varepsilon \cdot \cos x\\ \mathbf{else}:\\ \;\;\;\;\sin \varepsilon\\ \end{array} \]
Alternative 11
Error28.4
Cost6464
\[\sin \varepsilon \]
Alternative 12
Error44.7
Cost64
\[\varepsilon \]

Error

Reproduce

herbie shell --seed 2022325 
(FPCore (x eps)
  :name "2sin (example 3.3)"
  :precision binary64

  :herbie-target
  (* 2.0 (* (cos (+ x (/ eps 2.0))) (sin (/ eps 2.0))))

  (- (sin (+ x eps)) (sin x)))