Average Error: 15.1 → 0.5
Time: 24.7s
Precision: 64
\[x \cdot \frac{\frac{y}{z} \cdot t}{t}\]
\[\begin{array}{l} \mathbf{if}\;\frac{y}{z} \le -1.081925593636316638624250852721330734754 \cdot 10^{268} \lor \neg \left(\frac{y}{z} \le -1.636189466711752142567162663177727587498 \cdot 10^{-114} \lor \neg \left(\frac{y}{z} \le 1.319155274396128272951438676958151064215 \cdot 10^{-321}\right) \land \frac{y}{z} \le 1.104049436697308873782781562368572098325 \cdot 10^{252}\right):\\ \;\;\;\;y \cdot \frac{x}{z}\\ \mathbf{else}:\\ \;\;\;\;\frac{y}{z} \cdot x\\ \end{array}\]
x \cdot \frac{\frac{y}{z} \cdot t}{t}
\begin{array}{l}
\mathbf{if}\;\frac{y}{z} \le -1.081925593636316638624250852721330734754 \cdot 10^{268} \lor \neg \left(\frac{y}{z} \le -1.636189466711752142567162663177727587498 \cdot 10^{-114} \lor \neg \left(\frac{y}{z} \le 1.319155274396128272951438676958151064215 \cdot 10^{-321}\right) \land \frac{y}{z} \le 1.104049436697308873782781562368572098325 \cdot 10^{252}\right):\\
\;\;\;\;y \cdot \frac{x}{z}\\

\mathbf{else}:\\
\;\;\;\;\frac{y}{z} \cdot x\\

\end{array}
double f(double x, double y, double z, double t) {
        double r365271 = x;
        double r365272 = y;
        double r365273 = z;
        double r365274 = r365272 / r365273;
        double r365275 = t;
        double r365276 = r365274 * r365275;
        double r365277 = r365276 / r365275;
        double r365278 = r365271 * r365277;
        return r365278;
}

double f(double x, double y, double z, double __attribute__((unused)) t) {
        double r365279 = y;
        double r365280 = z;
        double r365281 = r365279 / r365280;
        double r365282 = -1.0819255936363166e+268;
        bool r365283 = r365281 <= r365282;
        double r365284 = -1.636189466711752e-114;
        bool r365285 = r365281 <= r365284;
        double r365286 = 1.3191552743961e-321;
        bool r365287 = r365281 <= r365286;
        double r365288 = !r365287;
        double r365289 = 1.1040494366973089e+252;
        bool r365290 = r365281 <= r365289;
        bool r365291 = r365288 && r365290;
        bool r365292 = r365285 || r365291;
        double r365293 = !r365292;
        bool r365294 = r365283 || r365293;
        double r365295 = x;
        double r365296 = r365295 / r365280;
        double r365297 = r365279 * r365296;
        double r365298 = r365281 * r365295;
        double r365299 = r365294 ? r365297 : r365298;
        return r365299;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original15.1
Target1.7
Herbie0.5
\[\begin{array}{l} \mathbf{if}\;\frac{\frac{y}{z} \cdot t}{t} \lt -1.206722051230450047215521150762600712224 \cdot 10^{245}:\\ \;\;\;\;\frac{y}{\frac{z}{x}}\\ \mathbf{elif}\;\frac{\frac{y}{z} \cdot t}{t} \lt -5.90752223693390632993316700759382836344 \cdot 10^{-275}:\\ \;\;\;\;x \cdot \frac{y}{z}\\ \mathbf{elif}\;\frac{\frac{y}{z} \cdot t}{t} \lt 5.658954423153415216825328199697215652986 \cdot 10^{-65}:\\ \;\;\;\;\frac{y}{\frac{z}{x}}\\ \mathbf{elif}\;\frac{\frac{y}{z} \cdot t}{t} \lt 2.008718050240713347941382056648619307142 \cdot 10^{217}:\\ \;\;\;\;x \cdot \frac{y}{z}\\ \mathbf{else}:\\ \;\;\;\;\frac{y \cdot x}{z}\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if (/ y z) < -1.0819255936363166e+268 or -1.636189466711752e-114 < (/ y z) < 1.3191552743961e-321 or 1.1040494366973089e+252 < (/ y z)

    1. Initial program 25.2

      \[x \cdot \frac{\frac{y}{z} \cdot t}{t}\]
    2. Simplified17.6

      \[\leadsto \color{blue}{\frac{y}{z} \cdot x}\]
    3. Using strategy rm
    4. Applied div-inv17.6

      \[\leadsto \color{blue}{\left(y \cdot \frac{1}{z}\right)} \cdot x\]
    5. Applied associate-*l*1.1

      \[\leadsto \color{blue}{y \cdot \left(\frac{1}{z} \cdot x\right)}\]
    6. Simplified1.0

      \[\leadsto y \cdot \color{blue}{\frac{x}{z}}\]

    if -1.0819255936363166e+268 < (/ y z) < -1.636189466711752e-114 or 1.3191552743961e-321 < (/ y z) < 1.1040494366973089e+252

    1. Initial program 9.8

      \[x \cdot \frac{\frac{y}{z} \cdot t}{t}\]
    2. Simplified0.3

      \[\leadsto \color{blue}{\frac{y}{z} \cdot x}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.5

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{y}{z} \le -1.081925593636316638624250852721330734754 \cdot 10^{268} \lor \neg \left(\frac{y}{z} \le -1.636189466711752142567162663177727587498 \cdot 10^{-114} \lor \neg \left(\frac{y}{z} \le 1.319155274396128272951438676958151064215 \cdot 10^{-321}\right) \land \frac{y}{z} \le 1.104049436697308873782781562368572098325 \cdot 10^{252}\right):\\ \;\;\;\;y \cdot \frac{x}{z}\\ \mathbf{else}:\\ \;\;\;\;\frac{y}{z} \cdot x\\ \end{array}\]

Reproduce

herbie shell --seed 2019347 +o rules:numerics
(FPCore (x y z t)
  :name "Graphics.Rendering.Chart.Backend.Diagrams:calcFontMetrics from Chart-diagrams-1.5.1, B"
  :precision binary64

  :herbie-target
  (if (< (/ (* (/ y z) t) t) -1.20672205123045e+245) (/ y (/ z x)) (if (< (/ (* (/ y z) t) t) -5.907522236933906e-275) (* x (/ y z)) (if (< (/ (* (/ y z) t) t) 5.658954423153415e-65) (/ y (/ z x)) (if (< (/ (* (/ y z) t) t) 2.0087180502407133e+217) (* x (/ y z)) (/ (* y x) z)))))

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