Average Error: 59.9 → 0.3
Time: 19.5s
Precision: binary64
Cost: 14272
\[-0.026 < x \land x < 0.026\]
\[\frac{1}{x} - \frac{1}{\tan x} \]
\[\frac{x \cdot \left(0.037037037037037035 + {\left(x \cdot \left(x \cdot 0.022222222222222223\right)\right)}^{3}\right)}{0.0004938271604938272 \cdot {x}^{4} + \left(0.1111111111111111 + \left(x \cdot x\right) \cdot -0.007407407407407408\right)} \]
(FPCore (x) :precision binary64 (- (/ 1.0 x) (/ 1.0 (tan x))))
(FPCore (x)
 :precision binary64
 (/
  (* x (+ 0.037037037037037035 (pow (* x (* x 0.022222222222222223)) 3.0)))
  (+
   (* 0.0004938271604938272 (pow x 4.0))
   (+ 0.1111111111111111 (* (* x x) -0.007407407407407408)))))
double code(double x) {
	return (1.0 / x) - (1.0 / tan(x));
}
double code(double x) {
	return (x * (0.037037037037037035 + pow((x * (x * 0.022222222222222223)), 3.0))) / ((0.0004938271604938272 * pow(x, 4.0)) + (0.1111111111111111 + ((x * x) * -0.007407407407407408)));
}
real(8) function code(x)
    real(8), intent (in) :: x
    code = (1.0d0 / x) - (1.0d0 / tan(x))
end function
real(8) function code(x)
    real(8), intent (in) :: x
    code = (x * (0.037037037037037035d0 + ((x * (x * 0.022222222222222223d0)) ** 3.0d0))) / ((0.0004938271604938272d0 * (x ** 4.0d0)) + (0.1111111111111111d0 + ((x * x) * (-0.007407407407407408d0))))
end function
public static double code(double x) {
	return (1.0 / x) - (1.0 / Math.tan(x));
}
public static double code(double x) {
	return (x * (0.037037037037037035 + Math.pow((x * (x * 0.022222222222222223)), 3.0))) / ((0.0004938271604938272 * Math.pow(x, 4.0)) + (0.1111111111111111 + ((x * x) * -0.007407407407407408)));
}
def code(x):
	return (1.0 / x) - (1.0 / math.tan(x))
def code(x):
	return (x * (0.037037037037037035 + math.pow((x * (x * 0.022222222222222223)), 3.0))) / ((0.0004938271604938272 * math.pow(x, 4.0)) + (0.1111111111111111 + ((x * x) * -0.007407407407407408)))
function code(x)
	return Float64(Float64(1.0 / x) - Float64(1.0 / tan(x)))
end
function code(x)
	return Float64(Float64(x * Float64(0.037037037037037035 + (Float64(x * Float64(x * 0.022222222222222223)) ^ 3.0))) / Float64(Float64(0.0004938271604938272 * (x ^ 4.0)) + Float64(0.1111111111111111 + Float64(Float64(x * x) * -0.007407407407407408))))
end
function tmp = code(x)
	tmp = (1.0 / x) - (1.0 / tan(x));
end
function tmp = code(x)
	tmp = (x * (0.037037037037037035 + ((x * (x * 0.022222222222222223)) ^ 3.0))) / ((0.0004938271604938272 * (x ^ 4.0)) + (0.1111111111111111 + ((x * x) * -0.007407407407407408)));
end
code[x_] := N[(N[(1.0 / x), $MachinePrecision] - N[(1.0 / N[Tan[x], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
code[x_] := N[(N[(x * N[(0.037037037037037035 + N[Power[N[(x * N[(x * 0.022222222222222223), $MachinePrecision]), $MachinePrecision], 3.0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(N[(0.0004938271604938272 * N[Power[x, 4.0], $MachinePrecision]), $MachinePrecision] + N[(0.1111111111111111 + N[(N[(x * x), $MachinePrecision] * -0.007407407407407408), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\frac{1}{x} - \frac{1}{\tan x}
\frac{x \cdot \left(0.037037037037037035 + {\left(x \cdot \left(x \cdot 0.022222222222222223\right)\right)}^{3}\right)}{0.0004938271604938272 \cdot {x}^{4} + \left(0.1111111111111111 + \left(x \cdot x\right) \cdot -0.007407407407407408\right)}

Error

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original59.9
Target0.1
Herbie0.3
\[\begin{array}{l} \mathbf{if}\;\left|x\right| < 0.026:\\ \;\;\;\;\frac{x}{3} \cdot \left(1 + \frac{x \cdot x}{15}\right)\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{x} - \frac{1}{\tan x}\\ \end{array} \]

Derivation

  1. Initial program 59.9

    \[\frac{1}{x} - \frac{1}{\tan x} \]
  2. Taylor expanded in x around 0 0.4

    \[\leadsto \color{blue}{0.3333333333333333 \cdot x + 0.022222222222222223 \cdot {x}^{3}} \]
  3. Simplified0.4

    \[\leadsto \color{blue}{x \cdot \mathsf{fma}\left(0.022222222222222223, x \cdot x, 0.3333333333333333\right)} \]
    Proof
    (*.f64 x (fma.f64 1/45 (*.f64 x x) 1/3)): 0 points increase in error, 0 points decrease in error
    (*.f64 x (Rewrite<= fma-def_binary64 (+.f64 (*.f64 1/45 (*.f64 x x)) 1/3))): 0 points increase in error, 0 points decrease in error
    (*.f64 x (Rewrite=> +-commutative_binary64 (+.f64 1/3 (*.f64 1/45 (*.f64 x x))))): 0 points increase in error, 0 points decrease in error
    (Rewrite<= distribute-rgt-out_binary64 (+.f64 (*.f64 1/3 x) (*.f64 (*.f64 1/45 (*.f64 x x)) x))): 1 points increase in error, 0 points decrease in error
    (+.f64 (*.f64 1/3 x) (Rewrite<= associate-*r*_binary64 (*.f64 1/45 (*.f64 (*.f64 x x) x)))): 0 points increase in error, 0 points decrease in error
    (+.f64 (*.f64 1/3 x) (*.f64 1/45 (Rewrite<= unpow3_binary64 (pow.f64 x 3)))): 0 points increase in error, 0 points decrease in error
  4. Applied egg-rr0.4

    \[\leadsto x \cdot \color{blue}{\left(0.022222222222222223 \cdot \left(x \cdot x\right) + 0.3333333333333333\right)} \]
  5. Applied egg-rr0.3

    \[\leadsto \color{blue}{\frac{\left(0.037037037037037035 + {\left(x \cdot \left(x \cdot 0.022222222222222223\right)\right)}^{3}\right) \cdot x}{0.0004938271604938272 \cdot {x}^{4} + \left(0.1111111111111111 - \left(x \cdot x\right) \cdot 0.007407407407407408\right)}} \]
  6. Final simplification0.3

    \[\leadsto \frac{x \cdot \left(0.037037037037037035 + {\left(x \cdot \left(x \cdot 0.022222222222222223\right)\right)}^{3}\right)}{0.0004938271604938272 \cdot {x}^{4} + \left(0.1111111111111111 + \left(x \cdot x\right) \cdot -0.007407407407407408\right)} \]

Alternatives

Alternative 1
Error0.3
Cost7424
\[\frac{0.037037037037037035 \cdot x}{0.0004938271604938272 \cdot {x}^{4} + \left(0.1111111111111111 + \left(x \cdot x\right) \cdot -0.007407407407407408\right)} \]
Alternative 2
Error0.4
Cost576
\[x \cdot \left(0.022222222222222223 \cdot \left(x \cdot x\right) + 0.3333333333333333\right) \]
Alternative 3
Error0.7
Cost192
\[x \cdot 0.3333333333333333 \]

Error

Reproduce

herbie shell --seed 2022318 
(FPCore (x)
  :name "invcot (example 3.9)"
  :precision binary64
  :pre (and (< -0.026 x) (< x 0.026))

  :herbie-target
  (if (< (fabs x) 0.026) (* (/ x 3.0) (+ 1.0 (/ (* x x) 15.0))) (- (/ 1.0 x) (/ 1.0 (tan x))))

  (- (/ 1.0 x) (/ 1.0 (tan x))))