Average Error: 12.2 → 12.5
Time: 12.7s
Precision: 64
\[\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} \mathbf{if}\;x \le -5.39848533641985994 \cdot 10^{-203}:\\ \;\;\;\;\mathsf{fma}\left(c \cdot a - y \cdot i, j, \left(\sqrt[3]{x} \cdot \sqrt[3]{x}\right) \cdot \left(\sqrt[3]{x} \cdot \left(y \cdot z - t \cdot a\right)\right) - b \cdot \left(c \cdot z - t \cdot i\right)\right)\\ \mathbf{elif}\;x \le 6.4754868919188863 \cdot 10^{-162}:\\ \;\;\;\;\mathsf{fma}\left(c \cdot a - y \cdot i, j, 0 - b \cdot \left(c \cdot z - t \cdot i\right)\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(c \cdot a - y \cdot i, j, \sqrt{x} \cdot \left(\sqrt{x} \cdot \left(y \cdot z - t \cdot a\right)\right) - b \cdot \left(c \cdot z - t \cdot i\right)\right)\\ \end{array}\]
\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}
\mathbf{if}\;x \le -5.39848533641985994 \cdot 10^{-203}:\\
\;\;\;\;\mathsf{fma}\left(c \cdot a - y \cdot i, j, \left(\sqrt[3]{x} \cdot \sqrt[3]{x}\right) \cdot \left(\sqrt[3]{x} \cdot \left(y \cdot z - t \cdot a\right)\right) - b \cdot \left(c \cdot z - t \cdot i\right)\right)\\

\mathbf{elif}\;x \le 6.4754868919188863 \cdot 10^{-162}:\\
\;\;\;\;\mathsf{fma}\left(c \cdot a - y \cdot i, j, 0 - b \cdot \left(c \cdot z - t \cdot i\right)\right)\\

\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(c \cdot a - y \cdot i, j, \sqrt{x} \cdot \left(\sqrt{x} \cdot \left(y \cdot z - t \cdot a\right)\right) - b \cdot \left(c \cdot z - t \cdot i\right)\right)\\

\end{array}
double f(double x, double y, double z, double t, double a, double b, double c, double i, double j) {
        double r925999 = x;
        double r926000 = y;
        double r926001 = z;
        double r926002 = r926000 * r926001;
        double r926003 = t;
        double r926004 = a;
        double r926005 = r926003 * r926004;
        double r926006 = r926002 - r926005;
        double r926007 = r925999 * r926006;
        double r926008 = b;
        double r926009 = c;
        double r926010 = r926009 * r926001;
        double r926011 = i;
        double r926012 = r926003 * r926011;
        double r926013 = r926010 - r926012;
        double r926014 = r926008 * r926013;
        double r926015 = r926007 - r926014;
        double r926016 = j;
        double r926017 = r926009 * r926004;
        double r926018 = r926000 * r926011;
        double r926019 = r926017 - r926018;
        double r926020 = r926016 * r926019;
        double r926021 = r926015 + r926020;
        return r926021;
}

double f(double x, double y, double z, double t, double a, double b, double c, double i, double j) {
        double r926022 = x;
        double r926023 = -5.39848533641986e-203;
        bool r926024 = r926022 <= r926023;
        double r926025 = c;
        double r926026 = a;
        double r926027 = r926025 * r926026;
        double r926028 = y;
        double r926029 = i;
        double r926030 = r926028 * r926029;
        double r926031 = r926027 - r926030;
        double r926032 = j;
        double r926033 = cbrt(r926022);
        double r926034 = r926033 * r926033;
        double r926035 = z;
        double r926036 = r926028 * r926035;
        double r926037 = t;
        double r926038 = r926037 * r926026;
        double r926039 = r926036 - r926038;
        double r926040 = r926033 * r926039;
        double r926041 = r926034 * r926040;
        double r926042 = b;
        double r926043 = r926025 * r926035;
        double r926044 = r926037 * r926029;
        double r926045 = r926043 - r926044;
        double r926046 = r926042 * r926045;
        double r926047 = r926041 - r926046;
        double r926048 = fma(r926031, r926032, r926047);
        double r926049 = 6.475486891918886e-162;
        bool r926050 = r926022 <= r926049;
        double r926051 = 0.0;
        double r926052 = r926051 - r926046;
        double r926053 = fma(r926031, r926032, r926052);
        double r926054 = sqrt(r926022);
        double r926055 = r926054 * r926039;
        double r926056 = r926054 * r926055;
        double r926057 = r926056 - r926046;
        double r926058 = fma(r926031, r926032, r926057);
        double r926059 = r926050 ? r926053 : r926058;
        double r926060 = r926024 ? r926048 : r926059;
        return r926060;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Bits error versus a

Bits error versus b

Bits error versus c

Bits error versus i

Bits error versus j

Target

Original12.2
Target20.1
Herbie12.5
\[\begin{array}{l} \mathbf{if}\;x \lt -1.46969429677770502 \cdot 10^{-64}:\\ \;\;\;\;\left(x \cdot \left(y \cdot z - t \cdot a\right) - \frac{b \cdot \left({\left(c \cdot z\right)}^{2} - {\left(t \cdot i\right)}^{2}\right)}{c \cdot z + t \cdot i}\right) + j \cdot \left(c \cdot a - y \cdot i\right)\\ \mathbf{elif}\;x \lt 3.2113527362226803 \cdot 10^{-147}:\\ \;\;\;\;\left(b \cdot i - x \cdot a\right) \cdot t - \left(z \cdot \left(c \cdot b\right) - j \cdot \left(c \cdot a - y \cdot i\right)\right)\\ \mathbf{else}:\\ \;\;\;\;\left(x \cdot \left(y \cdot z - t \cdot a\right) - \frac{b \cdot \left({\left(c \cdot z\right)}^{2} - {\left(t \cdot i\right)}^{2}\right)}{c \cdot z + t \cdot i}\right) + j \cdot \left(c \cdot a - y \cdot i\right)\\ \end{array}\]

Derivation

  1. Split input into 3 regimes
  2. if x < -5.39848533641986e-203

    1. Initial program 10.1

      \[\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)\]
    2. Simplified10.1

      \[\leadsto \color{blue}{\mathsf{fma}\left(c \cdot a - y \cdot i, j, x \cdot \left(y \cdot z - t \cdot a\right) - b \cdot \left(c \cdot z - t \cdot i\right)\right)}\]
    3. Using strategy rm
    4. Applied add-cube-cbrt10.5

      \[\leadsto \mathsf{fma}\left(c \cdot a - y \cdot i, j, \color{blue}{\left(\left(\sqrt[3]{x} \cdot \sqrt[3]{x}\right) \cdot \sqrt[3]{x}\right)} \cdot \left(y \cdot z - t \cdot a\right) - b \cdot \left(c \cdot z - t \cdot i\right)\right)\]
    5. Applied associate-*l*10.5

      \[\leadsto \mathsf{fma}\left(c \cdot a - y \cdot i, j, \color{blue}{\left(\sqrt[3]{x} \cdot \sqrt[3]{x}\right) \cdot \left(\sqrt[3]{x} \cdot \left(y \cdot z - t \cdot a\right)\right)} - b \cdot \left(c \cdot z - t \cdot i\right)\right)\]

    if -5.39848533641986e-203 < x < 6.475486891918886e-162

    1. Initial program 17.6

      \[\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)\]
    2. Simplified17.6

      \[\leadsto \color{blue}{\mathsf{fma}\left(c \cdot a - y \cdot i, j, x \cdot \left(y \cdot z - t \cdot a\right) - b \cdot \left(c \cdot z - t \cdot i\right)\right)}\]
    3. Taylor expanded around 0 18.0

      \[\leadsto \mathsf{fma}\left(c \cdot a - y \cdot i, j, \color{blue}{0} - b \cdot \left(c \cdot z - t \cdot i\right)\right)\]

    if 6.475486891918886e-162 < x

    1. Initial program 10.6

      \[\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)\]
    2. Simplified10.6

      \[\leadsto \color{blue}{\mathsf{fma}\left(c \cdot a - y \cdot i, j, x \cdot \left(y \cdot z - t \cdot a\right) - b \cdot \left(c \cdot z - t \cdot i\right)\right)}\]
    3. Using strategy rm
    4. Applied add-sqr-sqrt10.7

      \[\leadsto \mathsf{fma}\left(c \cdot a - y \cdot i, j, \color{blue}{\left(\sqrt{x} \cdot \sqrt{x}\right)} \cdot \left(y \cdot z - t \cdot a\right) - b \cdot \left(c \cdot z - t \cdot i\right)\right)\]
    5. Applied associate-*l*10.7

      \[\leadsto \mathsf{fma}\left(c \cdot a - y \cdot i, j, \color{blue}{\sqrt{x} \cdot \left(\sqrt{x} \cdot \left(y \cdot z - t \cdot a\right)\right)} - b \cdot \left(c \cdot z - t \cdot i\right)\right)\]
  3. Recombined 3 regimes into one program.
  4. Final simplification12.5

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le -5.39848533641985994 \cdot 10^{-203}:\\ \;\;\;\;\mathsf{fma}\left(c \cdot a - y \cdot i, j, \left(\sqrt[3]{x} \cdot \sqrt[3]{x}\right) \cdot \left(\sqrt[3]{x} \cdot \left(y \cdot z - t \cdot a\right)\right) - b \cdot \left(c \cdot z - t \cdot i\right)\right)\\ \mathbf{elif}\;x \le 6.4754868919188863 \cdot 10^{-162}:\\ \;\;\;\;\mathsf{fma}\left(c \cdot a - y \cdot i, j, 0 - b \cdot \left(c \cdot z - t \cdot i\right)\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(c \cdot a - y \cdot i, j, \sqrt{x} \cdot \left(\sqrt{x} \cdot \left(y \cdot z - t \cdot a\right)\right) - b \cdot \left(c \cdot z - t \cdot i\right)\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2020083 +o rules:numerics
(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) (pow (* t i) 2))) (+ (* 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) (pow (* t i) 2))) (+ (* c z) (* t i)))) (* j (- (* c a) (* y i))))))

  (+ (- (* x (- (* y z) (* t a))) (* b (- (* c z) (* t i)))) (* j (- (* c a) (* y i)))))