(FPCore (x y z t a) :precision binary64 (/ (- (* x y) (* z t)) a))
↓
(FPCore (x y z t a)
:precision binary64
(let* ((t_1 (- (/ x (/ a y)) (/ z (/ a t))))
(t_2 (- (* x y) (* z t)))
(t_3 (+ (/ t_2 a) (* (fma z (- t) (* z t)) (/ 1.0 a)))))
(if (<= t_2 (- INFINITY))
t_1
(if (<= t_2 -2e-175)
t_3
(if (<= t_2 0.0)
(- (* y (/ x a)) (/ t (/ a z)))
(if (<= t_2 5e+224) t_3 t_1))))))
double code(double x, double y, double z, double t, double a) {
return ((x * y) - (z * t)) / a;
}
↓
double code(double x, double y, double z, double t, double a) {
double t_1 = (x / (a / y)) - (z / (a / t));
double t_2 = (x * y) - (z * t);
double t_3 = (t_2 / a) + (fma(z, -t, (z * t)) * (1.0 / a));
double tmp;
if (t_2 <= -((double) INFINITY)) {
tmp = t_1;
} else if (t_2 <= -2e-175) {
tmp = t_3;
} else if (t_2 <= 0.0) {
tmp = (y * (x / a)) - (t / (a / z));
} else if (t_2 <= 5e+224) {
tmp = t_3;
} else {
tmp = t_1;
}
return tmp;
}
function code(x, y, z, t, a)
return Float64(Float64(Float64(x * y) - Float64(z * t)) / a)
end
(fma.f64 -1 (/.f64 t (/.f64 a z)) (/.f64 y (/.f64 a x))): 0 points increase in error, 0 points decrease in error
(fma.f64 -1 (Rewrite<= associate-/l*_binary64 (/.f64 (*.f64 t z) a)) (/.f64 y (/.f64 a x))): 31 points increase in error, 29 points decrease in error
(fma.f64 -1 (/.f64 (*.f64 t z) a) (Rewrite<= associate-/l*_binary64 (/.f64 (*.f64 y x) a))): 32 points increase in error, 34 points decrease in error
(Rewrite<= fma-def_binary64 (+.f64 (*.f64 -1 (/.f64 (*.f64 t z) a)) (/.f64 (*.f64 y x) a))): 0 points increase in error, 0 points decrease in error
(Rewrite=> +-commutative_binary64 (+.f64 (/.f64 (*.f64 y x) a) (*.f64 -1 (/.f64 (*.f64 t z) a)))): 0 points increase in error, 0 points decrease in error
(+.f64 (/.f64 (*.f64 y x) a) (Rewrite=> mul-1-neg_binary64 (neg.f64 (/.f64 (*.f64 t z) a)))): 0 points increase in error, 0 points decrease in error
(Rewrite=> unsub-neg_binary64 (-.f64 (/.f64 (*.f64 y x) a) (/.f64 (*.f64 t z) a))): 0 points increase in error, 0 points decrease in error
(Rewrite<= div-sub_binary64 (/.f64 (-.f64 (*.f64 y x) (*.f64 t z)) a)): 1 points increase in error, 2 points decrease in error
\[\leadsto \color{blue}{\frac{-t}{\frac{a}{z}} + y \cdot \frac{x}{a}}
\]
Recombined 3 regimes into one program.
Final simplification0.4
\[\leadsto \begin{array}{l}
\mathbf{if}\;x \cdot y - z \cdot t \leq -\infty:\\
\;\;\;\;\frac{x}{\frac{a}{y}} - \frac{z}{\frac{a}{t}}\\
\mathbf{elif}\;x \cdot y - z \cdot t \leq -2 \cdot 10^{-175}:\\
\;\;\;\;\frac{x \cdot y - z \cdot t}{a} + \mathsf{fma}\left(z, -t, z \cdot t\right) \cdot \frac{1}{a}\\
\mathbf{elif}\;x \cdot y - z \cdot t \leq 0:\\
\;\;\;\;y \cdot \frac{x}{a} - \frac{t}{\frac{a}{z}}\\
\mathbf{elif}\;x \cdot y - z \cdot t \leq 5 \cdot 10^{+224}:\\
\;\;\;\;\frac{x \cdot y - z \cdot t}{a} + \mathsf{fma}\left(z, -t, z \cdot t\right) \cdot \frac{1}{a}\\
\mathbf{else}:\\
\;\;\;\;\frac{x}{\frac{a}{y}} - \frac{z}{\frac{a}{t}}\\
\end{array}
\]
herbie shell --seed 2022300
(FPCore (x y z t a)
:name "Data.Colour.Matrix:inverse from colour-2.3.3, B"
:precision binary64
:herbie-target
(if (< z -2.468684968699548e+170) (- (* (/ y a) x) (* (/ t a) z)) (if (< z 6.309831121978371e-71) (/ (- (* x y) (* z t)) a) (- (* (/ y a) x) (* (/ t a) z))))
(/ (- (* x y) (* z t)) a))