Average Error: 0.3 → 0.3
Time: 13.5s
Precision: binary64
\[\frac{1 - \tan x \cdot \tan x}{1 + \tan x \cdot \tan x} \]
\[\begin{array}{l} t_0 := \tan x \cdot \tan x\\ \frac{\mathsf{fma}\left(1, 1, -t_0\right) + \mathsf{fma}\left(-\tan x, \tan x, t_0\right)}{1 + t_0} \end{array} \]
\frac{1 - \tan x \cdot \tan x}{1 + \tan x \cdot \tan x}
\begin{array}{l}
t_0 := \tan x \cdot \tan x\\
\frac{\mathsf{fma}\left(1, 1, -t_0\right) + \mathsf{fma}\left(-\tan x, \tan x, t_0\right)}{1 + t_0}
\end{array}
(FPCore (x)
 :precision binary64
 (/ (- 1.0 (* (tan x) (tan x))) (+ 1.0 (* (tan x) (tan x)))))
(FPCore (x)
 :precision binary64
 (let* ((t_0 (* (tan x) (tan x))))
   (/ (+ (fma 1.0 1.0 (- t_0)) (fma (- (tan x)) (tan x) t_0)) (+ 1.0 t_0))))
double code(double x) {
	return (1.0 - (tan(x) * tan(x))) / (1.0 + (tan(x) * tan(x)));
}
double code(double x) {
	double t_0 = tan(x) * tan(x);
	return (fma(1.0, 1.0, -t_0) + fma(-tan(x), tan(x), t_0)) / (1.0 + t_0);
}

Error

Bits error versus x

Derivation

  1. Initial program 0.3

    \[\frac{1 - \tan x \cdot \tan x}{1 + \tan x \cdot \tan x} \]
  2. Applied *-un-lft-identity_binary640.3

    \[\leadsto \frac{\color{blue}{1 \cdot 1} - \tan x \cdot \tan x}{1 + \tan x \cdot \tan x} \]
  3. Applied prod-diff_binary640.3

    \[\leadsto \frac{\color{blue}{\mathsf{fma}\left(1, 1, -\tan x \cdot \tan x\right) + \mathsf{fma}\left(-\tan x, \tan x, \tan x \cdot \tan x\right)}}{1 + \tan x \cdot \tan x} \]
  4. Final simplification0.3

    \[\leadsto \frac{\mathsf{fma}\left(1, 1, -\tan x \cdot \tan x\right) + \mathsf{fma}\left(-\tan x, \tan x, \tan x \cdot \tan x\right)}{1 + \tan x \cdot \tan x} \]

Reproduce

herbie shell --seed 2021215 
(FPCore (x)
  :name "Trigonometry B"
  :precision binary64
  (/ (- 1.0 (* (tan x) (tan x))) (+ 1.0 (* (tan x) (tan x)))))