Average Error: 15.3 → 0.5
Time: 1.1s
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 -4.7689681932628732 \cdot 10^{61} \lor \neg \left(\frac{-\left(2 \cdot far\right) \cdot near}{far - near} \le -1.32736955359934003 \cdot 10^{-306} \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 3.66481594550757464 \cdot 10^{56}\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)) < -4.7689681932628732e61 or -1.32736955359934003e-306 < (/ (neg (* (* 2.0 far) near)) (- far near)) < 0.0 or 3.66481594550757464e56 < (/ (neg (* (* 2.0 far) near)) (- far near))

    1. Initial program 51.5

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

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

    if -4.7689681932628732e61 < (/ (neg (* (* 2.0 far) near)) (- far near)) < -1.32736955359934003e-306 or 0.0 < (/ (neg (* (* 2.0 far) near)) (- far near)) < 3.66481594550757464e56

    1. Initial program 0.6

      \[\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 -4.7689681932628732 \cdot 10^{61} \lor \neg \left(\frac{-\left(2 \cdot far\right) \cdot near}{far - near} \le -1.32736955359934003 \cdot 10^{-306} \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 3.66481594550757464 \cdot 10^{56}\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 2020153 
(FPCore (far near)
  :name "(/ (- (* (* 2 far) near)) (- far near))"
  :precision binary64
  (/ (neg (* (* 2.0 far) near)) (- far near)))