Average Error: 1.9 → 5.2
Time: 26.3s
Precision: 64
\[x \cdot e^{y \cdot \left(\log z - t\right) + a \cdot \left(\log \left(1.0 - z\right) - b\right)}\]
\[\begin{array}{l} \mathbf{if}\;b \le -2.495491239283955 \cdot 10^{-125}:\\ \;\;\;\;x \cdot e^{y \cdot \left(\left(\log z - t\right)\right) + a \cdot \left(\left(\left(\log 1.0 - z \cdot 1.0\right) - \left(\frac{z}{1.0} \cdot \frac{z}{1.0}\right) \cdot \frac{1}{2}\right) - b\right)}\\ \mathbf{elif}\;b \le 1.1968319162136127 \cdot 10^{-252}:\\ \;\;\;\;x \cdot e^{a \cdot \log 1.0 + y \cdot \left(\log z - t\right)}\\ \mathbf{else}:\\ \;\;\;\;x \cdot e^{y \cdot \left(\left(\log z - t\right)\right) + a \cdot \left(\left(\left(\log 1.0 - z \cdot 1.0\right) - \left(\frac{z}{1.0} \cdot \frac{z}{1.0}\right) \cdot \frac{1}{2}\right) - b\right)}\\ \end{array}\]
x \cdot e^{y \cdot \left(\log z - t\right) + a \cdot \left(\log \left(1.0 - z\right) - b\right)}
\begin{array}{l}
\mathbf{if}\;b \le -2.495491239283955 \cdot 10^{-125}:\\
\;\;\;\;x \cdot e^{y \cdot \left(\left(\log z - t\right)\right) + a \cdot \left(\left(\left(\log 1.0 - z \cdot 1.0\right) - \left(\frac{z}{1.0} \cdot \frac{z}{1.0}\right) \cdot \frac{1}{2}\right) - b\right)}\\

\mathbf{elif}\;b \le 1.1968319162136127 \cdot 10^{-252}:\\
\;\;\;\;x \cdot e^{a \cdot \log 1.0 + y \cdot \left(\log z - t\right)}\\

\mathbf{else}:\\
\;\;\;\;x \cdot e^{y \cdot \left(\left(\log z - t\right)\right) + a \cdot \left(\left(\left(\log 1.0 - z \cdot 1.0\right) - \left(\frac{z}{1.0} \cdot \frac{z}{1.0}\right) \cdot \frac{1}{2}\right) - b\right)}\\

\end{array}
double f(double x, double y, double z, double t, double a, double b) {
        double r3196307 = x;
        double r3196308 = y;
        double r3196309 = z;
        double r3196310 = log(r3196309);
        double r3196311 = t;
        double r3196312 = r3196310 - r3196311;
        double r3196313 = r3196308 * r3196312;
        double r3196314 = a;
        double r3196315 = 1.0;
        double r3196316 = r3196315 - r3196309;
        double r3196317 = log(r3196316);
        double r3196318 = b;
        double r3196319 = r3196317 - r3196318;
        double r3196320 = r3196314 * r3196319;
        double r3196321 = r3196313 + r3196320;
        double r3196322 = exp(r3196321);
        double r3196323 = r3196307 * r3196322;
        return r3196323;
}

double f(double x, double y, double z, double t, double a, double b) {
        double r3196324 = b;
        double r3196325 = -2.495491239283955e-125;
        bool r3196326 = r3196324 <= r3196325;
        double r3196327 = x;
        double r3196328 = y;
        double r3196329 = z;
        double r3196330 = log(r3196329);
        double r3196331 = t;
        double r3196332 = r3196330 - r3196331;
        double r3196333 = /* ERROR: no posit support in C */;
        double r3196334 = /* ERROR: no posit support in C */;
        double r3196335 = r3196328 * r3196334;
        double r3196336 = a;
        double r3196337 = 1.0;
        double r3196338 = log(r3196337);
        double r3196339 = r3196329 * r3196337;
        double r3196340 = r3196338 - r3196339;
        double r3196341 = r3196329 / r3196337;
        double r3196342 = r3196341 * r3196341;
        double r3196343 = 0.5;
        double r3196344 = r3196342 * r3196343;
        double r3196345 = r3196340 - r3196344;
        double r3196346 = r3196345 - r3196324;
        double r3196347 = r3196336 * r3196346;
        double r3196348 = r3196335 + r3196347;
        double r3196349 = exp(r3196348);
        double r3196350 = r3196327 * r3196349;
        double r3196351 = 1.1968319162136127e-252;
        bool r3196352 = r3196324 <= r3196351;
        double r3196353 = r3196336 * r3196338;
        double r3196354 = r3196328 * r3196332;
        double r3196355 = r3196353 + r3196354;
        double r3196356 = exp(r3196355);
        double r3196357 = r3196327 * r3196356;
        double r3196358 = r3196352 ? r3196357 : r3196350;
        double r3196359 = r3196326 ? r3196350 : r3196358;
        return r3196359;
}

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

Derivation

  1. Split input into 2 regimes
  2. if b < -2.495491239283955e-125 or 1.1968319162136127e-252 < b

    1. Initial program 1.1

      \[x \cdot e^{y \cdot \left(\log z - t\right) + a \cdot \left(\log \left(1.0 - z\right) - b\right)}\]
    2. Taylor expanded around 0 0.5

      \[\leadsto x \cdot e^{y \cdot \left(\log z - t\right) + a \cdot \left(\color{blue}{\left(\log 1.0 - \left(1.0 \cdot z + \frac{1}{2} \cdot \frac{{z}^{2}}{{1.0}^{2}}\right)\right)} - b\right)}\]
    3. Simplified0.5

      \[\leadsto x \cdot e^{y \cdot \left(\log z - t\right) + a \cdot \left(\color{blue}{\left(\left(\log 1.0 - 1.0 \cdot z\right) - \left(\frac{z}{1.0} \cdot \frac{z}{1.0}\right) \cdot \frac{1}{2}\right)} - b\right)}\]
    4. Using strategy rm
    5. Applied insert-posit164.8

      \[\leadsto x \cdot e^{y \cdot \color{blue}{\left(\left(\log z - t\right)\right)} + a \cdot \left(\left(\left(\log 1.0 - 1.0 \cdot z\right) - \left(\frac{z}{1.0} \cdot \frac{z}{1.0}\right) \cdot \frac{1}{2}\right) - b\right)}\]

    if -2.495491239283955e-125 < b < 1.1968319162136127e-252

    1. Initial program 4.6

      \[x \cdot e^{y \cdot \left(\log z - t\right) + a \cdot \left(\log \left(1.0 - z\right) - b\right)}\]
    2. Taylor expanded around 0 6.6

      \[\leadsto x \cdot e^{\color{blue}{\left(\log z \cdot y + a \cdot \log 1.0\right) - t \cdot y}}\]
    3. Simplified6.6

      \[\leadsto x \cdot e^{\color{blue}{\log 1.0 \cdot a + y \cdot \left(\log z - t\right)}}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification5.2

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \le -2.495491239283955 \cdot 10^{-125}:\\ \;\;\;\;x \cdot e^{y \cdot \left(\left(\log z - t\right)\right) + a \cdot \left(\left(\left(\log 1.0 - z \cdot 1.0\right) - \left(\frac{z}{1.0} \cdot \frac{z}{1.0}\right) \cdot \frac{1}{2}\right) - b\right)}\\ \mathbf{elif}\;b \le 1.1968319162136127 \cdot 10^{-252}:\\ \;\;\;\;x \cdot e^{a \cdot \log 1.0 + y \cdot \left(\log z - t\right)}\\ \mathbf{else}:\\ \;\;\;\;x \cdot e^{y \cdot \left(\left(\log z - t\right)\right) + a \cdot \left(\left(\left(\log 1.0 - z \cdot 1.0\right) - \left(\frac{z}{1.0} \cdot \frac{z}{1.0}\right) \cdot \frac{1}{2}\right) - b\right)}\\ \end{array}\]

Reproduce

herbie shell --seed 2019156 
(FPCore (x y z t a b)
  :name "Numeric.SpecFunctions:incompleteBetaApprox from math-functions-0.1.5.2, B"
  (* x (exp (+ (* y (- (log z) t)) (* a (- (log (- 1.0 z)) b))))))