Average Error: 15.3 → 0.5
Time: 1.2s
Precision: binary64
\[\frac{-\left(2 \cdot far\right) \cdot near}{far - near}\]
\[\begin{array}{l} \mathbf{if}\;\frac{-\left(2 \cdot far\right) \cdot near}{far - near} \le -8.22669302481579422 \cdot 10^{76} \lor \neg \left(\frac{-\left(2 \cdot far\right) \cdot near}{far - near} \le -6.81994988027058132 \cdot 10^{-304} \lor \neg \left(\frac{-\left(2 \cdot far\right) \cdot near}{far - near} \le 0.0 \lor \neg \left(\frac{-\left(2 \cdot far\right) \cdot near}{far - near} \le 4.4059050740113772 \cdot 10^{61}\right)\right)\right):\\ \;\;\;\;\frac{2}{\frac{\frac{near}{far} + -1}{near}}\\ \mathbf{else}:\\ \;\;\;\;\frac{-\left(2 \cdot far\right) \cdot near}{far - near}\\ \end{array}\]

Error

Bits error versus far

Bits error versus near

Derivation

  1. Split input into 2 regimes
  2. if (/ (neg (* (* 2.0 far) near)) (- far near)) < -8.22669302481579422e76 or -6.81994988027058132e-304 < (/ (neg (* (* 2.0 far) near)) (- far near)) < 0.0 or 4.4059050740113772e61 < (/ (neg (* (* 2.0 far) near)) (- far near))

    1. Initial program 52.5

      \[\frac{-\left(2 \cdot far\right) \cdot near}{far - near}\]
    2. Simplified0.6

      \[\leadsto \color{blue}{\frac{2}{\frac{\frac{near}{far} + -1}{near}}}\]

    if -8.22669302481579422e76 < (/ (neg (* (* 2.0 far) near)) (- far near)) < -6.81994988027058132e-304 or 0.0 < (/ (neg (* (* 2.0 far) near)) (- far near)) < 4.4059050740113772e61

    1. Initial program 0.5

      \[\frac{-\left(2 \cdot far\right) \cdot near}{far - near}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.5

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{-\left(2 \cdot far\right) \cdot near}{far - near} \le -8.22669302481579422 \cdot 10^{76} \lor \neg \left(\frac{-\left(2 \cdot far\right) \cdot near}{far - near} \le -6.81994988027058132 \cdot 10^{-304} \lor \neg \left(\frac{-\left(2 \cdot far\right) \cdot near}{far - near} \le 0.0 \lor \neg \left(\frac{-\left(2 \cdot far\right) \cdot near}{far - near} \le 4.4059050740113772 \cdot 10^{61}\right)\right)\right):\\ \;\;\;\;\frac{2}{\frac{\frac{near}{far} + -1}{near}}\\ \mathbf{else}:\\ \;\;\;\;\frac{-\left(2 \cdot far\right) \cdot near}{far - near}\\ \end{array}\]

Reproduce

herbie shell --seed 2020152 
(FPCore (far near)
  :name "(/ (- (* (* 2 far) near)) (- far near))"
  :precision binary64
  (/ (neg (* (* 2.0 far) near)) (- far near)))