Average Error: 10.7 → 5.6
Time: 3.0s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -5.4324090959225345 \cdot 10^{117}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -9.7050156585541425 \cdot 10^{-179}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 6.504877116343706 \cdot 10^{-263}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 4.1129654620334933 \cdot 10^{181}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{else}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;a1 \cdot a2 \le -5.4324090959225345 \cdot 10^{117}:\\
\;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\

\mathbf{elif}\;a1 \cdot a2 \le -9.7050156585541425 \cdot 10^{-179}:\\
\;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\

\mathbf{elif}\;a1 \cdot a2 \le 6.504877116343706 \cdot 10^{-263}:\\
\;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\

\mathbf{elif}\;a1 \cdot a2 \le 4.1129654620334933 \cdot 10^{181}:\\
\;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\

\mathbf{else}:\\
\;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r118203 = a1;
        double r118204 = a2;
        double r118205 = r118203 * r118204;
        double r118206 = b1;
        double r118207 = b2;
        double r118208 = r118206 * r118207;
        double r118209 = r118205 / r118208;
        return r118209;
}

double f(double a1, double a2, double b1, double b2) {
        double r118210 = a1;
        double r118211 = a2;
        double r118212 = r118210 * r118211;
        double r118213 = -5.432409095922535e+117;
        bool r118214 = r118212 <= r118213;
        double r118215 = b1;
        double r118216 = r118210 / r118215;
        double r118217 = b2;
        double r118218 = r118211 / r118217;
        double r118219 = r118216 * r118218;
        double r118220 = -9.705015658554142e-179;
        bool r118221 = r118212 <= r118220;
        double r118222 = r118212 / r118215;
        double r118223 = r118222 / r118217;
        double r118224 = 6.504877116343706e-263;
        bool r118225 = r118212 <= r118224;
        double r118226 = r118211 / r118215;
        double r118227 = r118226 / r118217;
        double r118228 = r118210 * r118227;
        double r118229 = 4.112965462033493e+181;
        bool r118230 = r118212 <= r118229;
        double r118231 = r118230 ? r118223 : r118228;
        double r118232 = r118225 ? r118228 : r118231;
        double r118233 = r118221 ? r118223 : r118232;
        double r118234 = r118214 ? r118219 : r118233;
        return r118234;
}

Error

Bits error versus a1

Bits error versus a2

Bits error versus b1

Bits error versus b2

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original10.7
Target10.9
Herbie5.6
\[\frac{a1}{b1} \cdot \frac{a2}{b2}\]

Derivation

  1. Split input into 3 regimes
  2. if (* a1 a2) < -5.432409095922535e+117

    1. Initial program 22.9

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Using strategy rm
    3. Applied times-frac12.4

      \[\leadsto \color{blue}{\frac{a1}{b1} \cdot \frac{a2}{b2}}\]

    if -5.432409095922535e+117 < (* a1 a2) < -9.705015658554142e-179 or 6.504877116343706e-263 < (* a1 a2) < 4.112965462033493e+181

    1. Initial program 3.9

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Using strategy rm
    3. Applied associate-/r*4.1

      \[\leadsto \color{blue}{\frac{\frac{a1 \cdot a2}{b1}}{b2}}\]

    if -9.705015658554142e-179 < (* a1 a2) < 6.504877116343706e-263 or 4.112965462033493e+181 < (* a1 a2)

    1. Initial program 18.2

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Using strategy rm
    3. Applied associate-/r*18.4

      \[\leadsto \color{blue}{\frac{\frac{a1 \cdot a2}{b1}}{b2}}\]
    4. Using strategy rm
    5. Applied *-un-lft-identity18.4

      \[\leadsto \frac{\frac{a1 \cdot a2}{b1}}{\color{blue}{1 \cdot b2}}\]
    6. Applied *-un-lft-identity18.4

      \[\leadsto \frac{\frac{a1 \cdot a2}{\color{blue}{1 \cdot b1}}}{1 \cdot b2}\]
    7. Applied times-frac10.0

      \[\leadsto \frac{\color{blue}{\frac{a1}{1} \cdot \frac{a2}{b1}}}{1 \cdot b2}\]
    8. Applied times-frac5.9

      \[\leadsto \color{blue}{\frac{\frac{a1}{1}}{1} \cdot \frac{\frac{a2}{b1}}{b2}}\]
    9. Simplified5.9

      \[\leadsto \color{blue}{a1} \cdot \frac{\frac{a2}{b1}}{b2}\]
  3. Recombined 3 regimes into one program.
  4. Final simplification5.6

    \[\leadsto \begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -5.4324090959225345 \cdot 10^{117}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -9.7050156585541425 \cdot 10^{-179}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 6.504877116343706 \cdot 10^{-263}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 4.1129654620334933 \cdot 10^{181}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{else}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \end{array}\]

Reproduce

herbie shell --seed 2020034 
(FPCore (a1 a2 b1 b2)
  :name "Quotient of products"
  :precision binary64

  :herbie-target
  (* (/ a1 b1) (/ a2 b2))

  (/ (* a1 a2) (* b1 b2)))