Average Error: 4.2 → 3.7
Time: 1.5m
Precision: 64
Internal Precision: 384
\[x \cdot \left(\frac{y}{z} - \frac{t}{1.0 - z}\right)\]
\[\begin{array}{l} \mathbf{if}\;x \cdot \left(\frac{y}{z} - \frac{t}{1.0 - z}\right) \le -7.467050170486849 \cdot 10^{+121}:\\ \;\;\;\;\left(x \cdot y\right) \cdot \frac{1}{z} + x \cdot \left(-\frac{t}{1.0 - z}\right)\\ \mathbf{if}\;x \cdot \left(\frac{y}{z} - \frac{t}{1.0 - z}\right) \le 2.70893052731898 \cdot 10^{+154}:\\ \;\;\;\;x \cdot \frac{y}{z} + \left(x \cdot \left(-t\right)\right) \cdot \frac{1}{1.0 - z}\\ \mathbf{else}:\\ \;\;\;\;\left(x \cdot y\right) \cdot \frac{1}{z} + x \cdot \left(-\frac{t}{1.0 - z}\right)\\ \end{array}\]

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Target

Original4.2
Target3.9
Herbie3.7
\[\begin{array}{l} \mathbf{if}\;x \cdot \left(\frac{y}{z} - \frac{t}{1.0 - z}\right) \lt -7.623226303312042 \cdot 10^{-196}:\\ \;\;\;\;x \cdot \left(\frac{y}{z} - t \cdot \frac{1}{1.0 - z}\right)\\ \mathbf{if}\;x \cdot \left(\frac{y}{z} - \frac{t}{1.0 - z}\right) \lt 1.4133944927702302 \cdot 10^{-211}:\\ \;\;\;\;\frac{y \cdot x}{z} + \left(-\frac{t \cdot x}{1.0 - z}\right)\\ \mathbf{else}:\\ \;\;\;\;x \cdot \left(\frac{y}{z} - t \cdot \frac{1}{1.0 - z}\right)\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if (* x (- (/ y z) (/ t (- 1.0 z)))) < -7.467050170486849e+121 or 2.70893052731898e+154 < (* x (- (/ y z) (/ t (- 1.0 z))))

    1. Initial program 11.1

      \[x \cdot \left(\frac{y}{z} - \frac{t}{1.0 - z}\right)\]
    2. Using strategy rm
    3. Applied sub-neg11.1

      \[\leadsto x \cdot \color{blue}{\left(\frac{y}{z} + \left(-\frac{t}{1.0 - z}\right)\right)}\]
    4. Applied distribute-lft-in11.1

      \[\leadsto \color{blue}{x \cdot \frac{y}{z} + x \cdot \left(-\frac{t}{1.0 - z}\right)}\]
    5. Using strategy rm
    6. Applied div-inv11.1

      \[\leadsto x \cdot \color{blue}{\left(y \cdot \frac{1}{z}\right)} + x \cdot \left(-\frac{t}{1.0 - z}\right)\]
    7. Applied associate-*r*8.5

      \[\leadsto \color{blue}{\left(x \cdot y\right) \cdot \frac{1}{z}} + x \cdot \left(-\frac{t}{1.0 - z}\right)\]

    if -7.467050170486849e+121 < (* x (- (/ y z) (/ t (- 1.0 z)))) < 2.70893052731898e+154

    1. Initial program 1.5

      \[x \cdot \left(\frac{y}{z} - \frac{t}{1.0 - z}\right)\]
    2. Using strategy rm
    3. Applied sub-neg1.5

      \[\leadsto x \cdot \color{blue}{\left(\frac{y}{z} + \left(-\frac{t}{1.0 - z}\right)\right)}\]
    4. Applied distribute-lft-in1.5

      \[\leadsto \color{blue}{x \cdot \frac{y}{z} + x \cdot \left(-\frac{t}{1.0 - z}\right)}\]
    5. Using strategy rm
    6. Applied div-inv1.5

      \[\leadsto x \cdot \frac{y}{z} + x \cdot \left(-\color{blue}{t \cdot \frac{1}{1.0 - z}}\right)\]
    7. Applied distribute-lft-neg-in1.5

      \[\leadsto x \cdot \frac{y}{z} + x \cdot \color{blue}{\left(\left(-t\right) \cdot \frac{1}{1.0 - z}\right)}\]
    8. Applied associate-*r*1.8

      \[\leadsto x \cdot \frac{y}{z} + \color{blue}{\left(x \cdot \left(-t\right)\right) \cdot \frac{1}{1.0 - z}}\]
  3. Recombined 2 regimes into one program.
  4. Removed slow pow expressions.

Runtime

Time bar (total: 1.5m)Debug log

herbie shell --seed '#(1567391828 2030694642 2833800258 828025724 3004380912 3532991858)' +o setup:early-exit
(FPCore (x y z t)
  :name "Numeric.SpecFunctions:invIncompleteBetaWorker from math-functions-0.1.5.2, C"

  :herbie-target
  (if (< (* x (- (/ y z) (/ t (- 1.0 z)))) -7.623226303312042e-196) (* x (- (/ y z) (* t (/ 1 (- 1.0 z))))) (if (< (* x (- (/ y z) (/ t (- 1.0 z)))) 1.4133944927702302e-211) (+ (/ (* y x) z) (- (/ (* t x) (- 1.0 z)))) (* x (- (/ y z) (* t (/ 1 (- 1.0 z)))))))

  (* x (- (/ y z) (/ t (- 1.0 z)))))