(FPCore (x y z t a b c i j) :precision binary64 (+ (- (* x (- (* y z) (* t a))) (* b (- (* c z) (* t i)))) (* j (- (* c a) (* y i)))))
(FPCore (x y z t a b c i j)
:precision binary64
(let* ((t_1 (* y (* j i)))
(t_2
(fma
b
(- (* t i) (* c z))
(fma y (- (* x z) (* j i)) (* a (- (* c j) (* x t))))))
(t_3 (- (* c a) (* y i)))
(t_4 (* t (- (* b i) (* x a))))
(t_5 (* i (* t b)))
(t_6 (- (* y z) (* t a)))
(t_7 (- (* a j) (* z b)))
(t_8 (* j t_3)))
(if (<= c -1e+30)
(fma x t_6 (+ (* c t_7) (- t_5 t_1)))
(if (<= c -6.894880890659607e-187)
t_2
(if (<= c 2.4039080990269493e-287)
(fma z (- (* x y) (* c b)) (fma t_3 j t_4))
(if (<= c 2.8267541173163815e-252)
t_2
(if (<= c 5.759062406266529e-235)
(fma x t_6 (+ t_5 t_8))
(if (<= c 2.28273651883575e-204)
(- (+ t_4 (- (pow (cbrt (* y (* x z))) 3.0) t_1)) (* c (* z b)))
(if (<= c 1e-18)
(fma x t_6 (fma b (fma z (- c) (* t i)) t_8))
(fma x t_6 (fma c t_7 (* i (- (* t b) (* y j))))))))))))))double code(double x, double y, double z, double t, double a, double b, double c, double i, double j) {
return ((x * ((y * z) - (t * a))) - (b * ((c * z) - (t * i)))) + (j * ((c * a) - (y * i)));
}
double code(double x, double y, double z, double t, double a, double b, double c, double i, double j) {
double t_1 = y * (j * i);
double t_2 = fma(b, ((t * i) - (c * z)), fma(y, ((x * z) - (j * i)), (a * ((c * j) - (x * t)))));
double t_3 = (c * a) - (y * i);
double t_4 = t * ((b * i) - (x * a));
double t_5 = i * (t * b);
double t_6 = (y * z) - (t * a);
double t_7 = (a * j) - (z * b);
double t_8 = j * t_3;
double tmp;
if (c <= -1e+30) {
tmp = fma(x, t_6, ((c * t_7) + (t_5 - t_1)));
} else if (c <= -6.894880890659607e-187) {
tmp = t_2;
} else if (c <= 2.4039080990269493e-287) {
tmp = fma(z, ((x * y) - (c * b)), fma(t_3, j, t_4));
} else if (c <= 2.8267541173163815e-252) {
tmp = t_2;
} else if (c <= 5.759062406266529e-235) {
tmp = fma(x, t_6, (t_5 + t_8));
} else if (c <= 2.28273651883575e-204) {
tmp = (t_4 + (pow(cbrt((y * (x * z))), 3.0) - t_1)) - (c * (z * b));
} else if (c <= 1e-18) {
tmp = fma(x, t_6, fma(b, fma(z, -c, (t * i)), t_8));
} else {
tmp = fma(x, t_6, fma(c, t_7, (i * ((t * b) - (y * j)))));
}
return tmp;
}
function code(x, y, z, t, a, b, c, i, j) return Float64(Float64(Float64(x * Float64(Float64(y * z) - Float64(t * a))) - Float64(b * Float64(Float64(c * z) - Float64(t * i)))) + Float64(j * Float64(Float64(c * a) - Float64(y * i)))) end
function code(x, y, z, t, a, b, c, i, j) t_1 = Float64(y * Float64(j * i)) t_2 = fma(b, Float64(Float64(t * i) - Float64(c * z)), fma(y, Float64(Float64(x * z) - Float64(j * i)), Float64(a * Float64(Float64(c * j) - Float64(x * t))))) t_3 = Float64(Float64(c * a) - Float64(y * i)) t_4 = Float64(t * Float64(Float64(b * i) - Float64(x * a))) t_5 = Float64(i * Float64(t * b)) t_6 = Float64(Float64(y * z) - Float64(t * a)) t_7 = Float64(Float64(a * j) - Float64(z * b)) t_8 = Float64(j * t_3) tmp = 0.0 if (c <= -1e+30) tmp = fma(x, t_6, Float64(Float64(c * t_7) + Float64(t_5 - t_1))); elseif (c <= -6.894880890659607e-187) tmp = t_2; elseif (c <= 2.4039080990269493e-287) tmp = fma(z, Float64(Float64(x * y) - Float64(c * b)), fma(t_3, j, t_4)); elseif (c <= 2.8267541173163815e-252) tmp = t_2; elseif (c <= 5.759062406266529e-235) tmp = fma(x, t_6, Float64(t_5 + t_8)); elseif (c <= 2.28273651883575e-204) tmp = Float64(Float64(t_4 + Float64((cbrt(Float64(y * Float64(x * z))) ^ 3.0) - t_1)) - Float64(c * Float64(z * b))); elseif (c <= 1e-18) tmp = fma(x, t_6, fma(b, fma(z, Float64(-c), Float64(t * i)), t_8)); else tmp = fma(x, t_6, fma(c, t_7, Float64(i * Float64(Float64(t * b) - Float64(y * j))))); end return tmp end
code[x_, y_, z_, t_, a_, b_, c_, i_, j_] := N[(N[(N[(x * N[(N[(y * z), $MachinePrecision] - N[(t * a), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] - N[(b * N[(N[(c * z), $MachinePrecision] - N[(t * i), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(j * N[(N[(c * a), $MachinePrecision] - N[(y * i), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
code[x_, y_, z_, t_, a_, b_, c_, i_, j_] := Block[{t$95$1 = N[(y * N[(j * i), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$2 = N[(b * N[(N[(t * i), $MachinePrecision] - N[(c * z), $MachinePrecision]), $MachinePrecision] + N[(y * N[(N[(x * z), $MachinePrecision] - N[(j * i), $MachinePrecision]), $MachinePrecision] + N[(a * N[(N[(c * j), $MachinePrecision] - N[(x * t), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$3 = N[(N[(c * a), $MachinePrecision] - N[(y * i), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$4 = N[(t * N[(N[(b * i), $MachinePrecision] - N[(x * a), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$5 = N[(i * N[(t * b), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$6 = N[(N[(y * z), $MachinePrecision] - N[(t * a), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$7 = N[(N[(a * j), $MachinePrecision] - N[(z * b), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$8 = N[(j * t$95$3), $MachinePrecision]}, If[LessEqual[c, -1e+30], N[(x * t$95$6 + N[(N[(c * t$95$7), $MachinePrecision] + N[(t$95$5 - t$95$1), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[c, -6.894880890659607e-187], t$95$2, If[LessEqual[c, 2.4039080990269493e-287], N[(z * N[(N[(x * y), $MachinePrecision] - N[(c * b), $MachinePrecision]), $MachinePrecision] + N[(t$95$3 * j + t$95$4), $MachinePrecision]), $MachinePrecision], If[LessEqual[c, 2.8267541173163815e-252], t$95$2, If[LessEqual[c, 5.759062406266529e-235], N[(x * t$95$6 + N[(t$95$5 + t$95$8), $MachinePrecision]), $MachinePrecision], If[LessEqual[c, 2.28273651883575e-204], N[(N[(t$95$4 + N[(N[Power[N[Power[N[(y * N[(x * z), $MachinePrecision]), $MachinePrecision], 1/3], $MachinePrecision], 3.0], $MachinePrecision] - t$95$1), $MachinePrecision]), $MachinePrecision] - N[(c * N[(z * b), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[c, 1e-18], N[(x * t$95$6 + N[(b * N[(z * (-c) + N[(t * i), $MachinePrecision]), $MachinePrecision] + t$95$8), $MachinePrecision]), $MachinePrecision], N[(x * t$95$6 + N[(c * t$95$7 + N[(i * N[(N[(t * b), $MachinePrecision] - N[(y * j), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]]]]]]]]]]]]]]
\left(x \cdot \left(y \cdot z - t \cdot a\right) - b \cdot \left(c \cdot z - t \cdot i\right)\right) + j \cdot \left(c \cdot a - y \cdot i\right)
\begin{array}{l}
t_1 := y \cdot \left(j \cdot i\right)\\
t_2 := \mathsf{fma}\left(b, t \cdot i - c \cdot z, \mathsf{fma}\left(y, x \cdot z - j \cdot i, a \cdot \left(c \cdot j - x \cdot t\right)\right)\right)\\
t_3 := c \cdot a - y \cdot i\\
t_4 := t \cdot \left(b \cdot i - x \cdot a\right)\\
t_5 := i \cdot \left(t \cdot b\right)\\
t_6 := y \cdot z - t \cdot a\\
t_7 := a \cdot j - z \cdot b\\
t_8 := j \cdot t_3\\
\mathbf{if}\;c \leq -1 \cdot 10^{+30}:\\
\;\;\;\;\mathsf{fma}\left(x, t_6, c \cdot t_7 + \left(t_5 - t_1\right)\right)\\
\mathbf{elif}\;c \leq -6.894880890659607 \cdot 10^{-187}:\\
\;\;\;\;t_2\\
\mathbf{elif}\;c \leq 2.4039080990269493 \cdot 10^{-287}:\\
\;\;\;\;\mathsf{fma}\left(z, x \cdot y - c \cdot b, \mathsf{fma}\left(t_3, j, t_4\right)\right)\\
\mathbf{elif}\;c \leq 2.8267541173163815 \cdot 10^{-252}:\\
\;\;\;\;t_2\\
\mathbf{elif}\;c \leq 5.759062406266529 \cdot 10^{-235}:\\
\;\;\;\;\mathsf{fma}\left(x, t_6, t_5 + t_8\right)\\
\mathbf{elif}\;c \leq 2.28273651883575 \cdot 10^{-204}:\\
\;\;\;\;\left(t_4 + \left({\left(\sqrt[3]{y \cdot \left(x \cdot z\right)}\right)}^{3} - t_1\right)\right) - c \cdot \left(z \cdot b\right)\\
\mathbf{elif}\;c \leq 10^{-18}:\\
\;\;\;\;\mathsf{fma}\left(x, t_6, \mathsf{fma}\left(b, \mathsf{fma}\left(z, -c, t \cdot i\right), t_8\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(x, t_6, \mathsf{fma}\left(c, t_7, i \cdot \left(t \cdot b - y \cdot j\right)\right)\right)\\
\end{array}
| Original | 11.8 |
|---|---|
| Target | 19.8 |
| Herbie | 8.4 |
if c < -1e30Initial program 17.7
Simplified17.7
Taylor expanded in c around 0 7.4
if -1e30 < c < -6.8948808906596067e-187 or 2.40390809902694934e-287 < c < 2.82675411731638154e-252Initial program 8.5
Simplified8.5
Applied egg-rr8.8
Taylor expanded in x around 0 8.5
Simplified8.6
if -6.8948808906596067e-187 < c < 2.40390809902694934e-287Initial program 10.4
Simplified10.4
Applied egg-rr10.7
Taylor expanded in z around 0 8.9
Simplified8.8
if 2.82675411731638154e-252 < c < 5.75906240626652913e-235Initial program 11.2
Simplified11.2
Applied egg-rr11.5
Taylor expanded in z around 0 14.2
if 5.75906240626652913e-235 < c < 2.2827365188357501e-204Initial program 7.5
Simplified7.5
Taylor expanded in t around 0 14.4
Applied egg-rr14.5
Taylor expanded in y around inf 18.9
if 2.2827365188357501e-204 < c < 1.0000000000000001e-18Initial program 8.3
Simplified8.2
Applied egg-rr8.6
Taylor expanded in j around 0 8.2
Simplified8.2
if 1.0000000000000001e-18 < c Initial program 15.7
Simplified15.7
Taylor expanded in b around 0 15.7
Simplified7.1
Final simplification8.4
herbie shell --seed 2022192
(FPCore (x y z t a b c i j)
:name "Data.Colour.Matrix:determinant from colour-2.3.3, A"
:precision binary64
:herbie-target
(if (< x -1.469694296777705e-64) (+ (- (* x (- (* y z) (* t a))) (/ (* b (- (pow (* c z) 2.0) (pow (* t i) 2.0))) (+ (* c z) (* t i)))) (* j (- (* c a) (* y i)))) (if (< x 3.2113527362226803e-147) (- (* (- (* b i) (* x a)) t) (- (* z (* c b)) (* j (- (* c a) (* y i))))) (+ (- (* x (- (* y z) (* t a))) (/ (* b (- (pow (* c z) 2.0) (pow (* t i) 2.0))) (+ (* c z) (* t i)))) (* j (- (* c a) (* y i))))))
(+ (- (* x (- (* y z) (* t a))) (* b (- (* c z) (* t i)))) (* j (- (* c a) (* y i)))))