Average Error: 6.5 → 2.3
Time: 38.8s
Precision: 64
\[\frac{\frac{1}{x}}{y \cdot \left(1 + z \cdot z\right)}\]
\[\begin{array}{l} \mathbf{if}\;\frac{1}{x} \le -146184260628.28277587890625:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(x, 1, \left(z \cdot x\right) \cdot z\right) \cdot y}\\ \mathbf{elif}\;\frac{1}{x} \le 6.546427897730510596981806648031465556414 \cdot 10^{-5}:\\ \;\;\;\;\frac{\frac{\frac{\frac{1}{x}}{y}}{\sqrt{\mathsf{fma}\left(z, z, 1\right)}}}{\sqrt{\mathsf{fma}\left(z, z, 1\right)}}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(x, 1, \left(z \cdot x\right) \cdot z\right) \cdot y}\\ \end{array}\]
\frac{\frac{1}{x}}{y \cdot \left(1 + z \cdot z\right)}
\begin{array}{l}
\mathbf{if}\;\frac{1}{x} \le -146184260628.28277587890625:\\
\;\;\;\;\frac{1}{\mathsf{fma}\left(x, 1, \left(z \cdot x\right) \cdot z\right) \cdot y}\\

\mathbf{elif}\;\frac{1}{x} \le 6.546427897730510596981806648031465556414 \cdot 10^{-5}:\\
\;\;\;\;\frac{\frac{\frac{\frac{1}{x}}{y}}{\sqrt{\mathsf{fma}\left(z, z, 1\right)}}}{\sqrt{\mathsf{fma}\left(z, z, 1\right)}}\\

\mathbf{else}:\\
\;\;\;\;\frac{1}{\mathsf{fma}\left(x, 1, \left(z \cdot x\right) \cdot z\right) \cdot y}\\

\end{array}
double f(double x, double y, double z) {
        double r11846982 = 1.0;
        double r11846983 = x;
        double r11846984 = r11846982 / r11846983;
        double r11846985 = y;
        double r11846986 = z;
        double r11846987 = r11846986 * r11846986;
        double r11846988 = r11846982 + r11846987;
        double r11846989 = r11846985 * r11846988;
        double r11846990 = r11846984 / r11846989;
        return r11846990;
}

double f(double x, double y, double z) {
        double r11846991 = 1.0;
        double r11846992 = x;
        double r11846993 = r11846991 / r11846992;
        double r11846994 = -146184260628.28278;
        bool r11846995 = r11846993 <= r11846994;
        double r11846996 = z;
        double r11846997 = r11846996 * r11846992;
        double r11846998 = r11846997 * r11846996;
        double r11846999 = fma(r11846992, r11846991, r11846998);
        double r11847000 = y;
        double r11847001 = r11846999 * r11847000;
        double r11847002 = r11846991 / r11847001;
        double r11847003 = 6.54642789773051e-05;
        bool r11847004 = r11846993 <= r11847003;
        double r11847005 = r11846993 / r11847000;
        double r11847006 = fma(r11846996, r11846996, r11846991);
        double r11847007 = sqrt(r11847006);
        double r11847008 = r11847005 / r11847007;
        double r11847009 = r11847008 / r11847007;
        double r11847010 = r11847004 ? r11847009 : r11847002;
        double r11847011 = r11846995 ? r11847002 : r11847010;
        return r11847011;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Target

Original6.5
Target5.7
Herbie2.3
\[\begin{array}{l} \mathbf{if}\;y \cdot \left(1 + z \cdot z\right) \lt -\infty:\\ \;\;\;\;\frac{\frac{1}{y}}{\left(1 + z \cdot z\right) \cdot x}\\ \mathbf{elif}\;y \cdot \left(1 + z \cdot z\right) \lt 8.680743250567251617010582226806563373013 \cdot 10^{305}:\\ \;\;\;\;\frac{\frac{1}{x}}{\left(1 + z \cdot z\right) \cdot y}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{1}{y}}{\left(1 + z \cdot z\right) \cdot x}\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if (/ 1.0 x) < -146184260628.28278 or 6.54642789773051e-05 < (/ 1.0 x)

    1. Initial program 12.5

      \[\frac{\frac{1}{x}}{y \cdot \left(1 + z \cdot z\right)}\]
    2. Simplified12.9

      \[\leadsto \color{blue}{\frac{\frac{\frac{1}{x}}{y}}{\mathsf{fma}\left(z, z, 1\right)}}\]
    3. Using strategy rm
    4. Applied *-un-lft-identity12.9

      \[\leadsto \frac{\frac{\frac{1}{x}}{\color{blue}{1 \cdot y}}}{\mathsf{fma}\left(z, z, 1\right)}\]
    5. Applied div-inv12.9

      \[\leadsto \frac{\frac{\color{blue}{1 \cdot \frac{1}{x}}}{1 \cdot y}}{\mathsf{fma}\left(z, z, 1\right)}\]
    6. Applied times-frac12.9

      \[\leadsto \frac{\color{blue}{\frac{1}{1} \cdot \frac{\frac{1}{x}}{y}}}{\mathsf{fma}\left(z, z, 1\right)}\]
    7. Applied associate-/l*13.1

      \[\leadsto \color{blue}{\frac{\frac{1}{1}}{\frac{\mathsf{fma}\left(z, z, 1\right)}{\frac{\frac{1}{x}}{y}}}}\]
    8. Simplified12.6

      \[\leadsto \frac{\frac{1}{1}}{\color{blue}{\mathsf{fma}\left(z, z, 1\right) \cdot \left(y \cdot x\right)}}\]
    9. Taylor expanded around inf 12.4

      \[\leadsto \frac{\frac{1}{1}}{\color{blue}{x \cdot \left({z}^{2} \cdot y\right) + 1 \cdot \left(x \cdot y\right)}}\]
    10. Simplified3.2

      \[\leadsto \frac{\frac{1}{1}}{\color{blue}{y \cdot \mathsf{fma}\left(x, 1, \left(x \cdot z\right) \cdot z\right)}}\]

    if -146184260628.28278 < (/ 1.0 x) < 6.54642789773051e-05

    1. Initial program 1.5

      \[\frac{\frac{1}{x}}{y \cdot \left(1 + z \cdot z\right)}\]
    2. Simplified1.5

      \[\leadsto \color{blue}{\frac{\frac{\frac{1}{x}}{y}}{\mathsf{fma}\left(z, z, 1\right)}}\]
    3. Using strategy rm
    4. Applied add-sqr-sqrt1.5

      \[\leadsto \frac{\frac{\frac{1}{x}}{y}}{\color{blue}{\sqrt{\mathsf{fma}\left(z, z, 1\right)} \cdot \sqrt{\mathsf{fma}\left(z, z, 1\right)}}}\]
    5. Applied associate-/r*1.5

      \[\leadsto \color{blue}{\frac{\frac{\frac{\frac{1}{x}}{y}}{\sqrt{\mathsf{fma}\left(z, z, 1\right)}}}{\sqrt{\mathsf{fma}\left(z, z, 1\right)}}}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification2.3

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{1}{x} \le -146184260628.28277587890625:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(x, 1, \left(z \cdot x\right) \cdot z\right) \cdot y}\\ \mathbf{elif}\;\frac{1}{x} \le 6.546427897730510596981806648031465556414 \cdot 10^{-5}:\\ \;\;\;\;\frac{\frac{\frac{\frac{1}{x}}{y}}{\sqrt{\mathsf{fma}\left(z, z, 1\right)}}}{\sqrt{\mathsf{fma}\left(z, z, 1\right)}}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(x, 1, \left(z \cdot x\right) \cdot z\right) \cdot y}\\ \end{array}\]

Reproduce

herbie shell --seed 2019174 +o rules:numerics
(FPCore (x y z)
  :name "Statistics.Distribution.CauchyLorentz:$cdensity from math-functions-0.1.5.2"

  :herbie-target
  (if (< (* y (+ 1.0 (* z z))) -inf.0) (/ (/ 1.0 y) (* (+ 1.0 (* z z)) x)) (if (< (* y (+ 1.0 (* z z))) 8.680743250567252e+305) (/ (/ 1.0 x) (* (+ 1.0 (* z z)) y)) (/ (/ 1.0 y) (* (+ 1.0 (* z z)) x))))

  (/ (/ 1.0 x) (* y (+ 1.0 (* z z)))))