Average Error: 10.5 → 6.8
Time: 23.5s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -1.4413717353503713 \cdot 10^{+166}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -7.442078385181948 \cdot 10^{-96}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1} \cdot \frac{1}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 0.0:\\ \;\;\;\;\frac{a1}{\frac{b2 \cdot b1}{a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le 4.15369418345865 \cdot 10^{+157}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1} \cdot \frac{1}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{\frac{b2 \cdot b1}{a2}}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;a1 \cdot a2 \le -1.4413717353503713 \cdot 10^{+166}:\\
\;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\

\mathbf{elif}\;a1 \cdot a2 \le -7.442078385181948 \cdot 10^{-96}:\\
\;\;\;\;\frac{a1 \cdot a2}{b1} \cdot \frac{1}{b2}\\

\mathbf{elif}\;a1 \cdot a2 \le 0.0:\\
\;\;\;\;\frac{a1}{\frac{b2 \cdot b1}{a2}}\\

\mathbf{elif}\;a1 \cdot a2 \le 4.15369418345865 \cdot 10^{+157}:\\
\;\;\;\;\frac{a1 \cdot a2}{b1} \cdot \frac{1}{b2}\\

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r24578107 = a1;
        double r24578108 = a2;
        double r24578109 = r24578107 * r24578108;
        double r24578110 = b1;
        double r24578111 = b2;
        double r24578112 = r24578110 * r24578111;
        double r24578113 = r24578109 / r24578112;
        return r24578113;
}

double f(double a1, double a2, double b1, double b2) {
        double r24578114 = a1;
        double r24578115 = a2;
        double r24578116 = r24578114 * r24578115;
        double r24578117 = -1.4413717353503713e+166;
        bool r24578118 = r24578116 <= r24578117;
        double r24578119 = b1;
        double r24578120 = r24578114 / r24578119;
        double r24578121 = b2;
        double r24578122 = r24578115 / r24578121;
        double r24578123 = r24578120 * r24578122;
        double r24578124 = -7.442078385181948e-96;
        bool r24578125 = r24578116 <= r24578124;
        double r24578126 = r24578116 / r24578119;
        double r24578127 = 1.0;
        double r24578128 = r24578127 / r24578121;
        double r24578129 = r24578126 * r24578128;
        double r24578130 = 0.0;
        bool r24578131 = r24578116 <= r24578130;
        double r24578132 = r24578121 * r24578119;
        double r24578133 = r24578132 / r24578115;
        double r24578134 = r24578114 / r24578133;
        double r24578135 = 4.15369418345865e+157;
        bool r24578136 = r24578116 <= r24578135;
        double r24578137 = r24578136 ? r24578129 : r24578134;
        double r24578138 = r24578131 ? r24578134 : r24578137;
        double r24578139 = r24578125 ? r24578129 : r24578138;
        double r24578140 = r24578118 ? r24578123 : r24578139;
        return r24578140;
}

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.5
Target11.4
Herbie6.8
\[\frac{a1}{b1} \cdot \frac{a2}{b2}\]

Derivation

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

    1. Initial program 28.4

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

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

    if -1.4413717353503713e+166 < (* a1 a2) < -7.442078385181948e-96 or 0.0 < (* a1 a2) < 4.15369418345865e+157

    1. Initial program 4.3

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

      \[\leadsto \color{blue}{\frac{\frac{a1 \cdot a2}{b1}}{b2}}\]
    4. Taylor expanded around 0 4.3

      \[\leadsto \frac{\color{blue}{\frac{a1 \cdot a2}{b1}}}{b2}\]
    5. Using strategy rm
    6. Applied div-inv4.4

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

    if -7.442078385181948e-96 < (* a1 a2) < 0.0 or 4.15369418345865e+157 < (* a1 a2)

    1. Initial program 15.7

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -1.4413717353503713 \cdot 10^{+166}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -7.442078385181948 \cdot 10^{-96}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1} \cdot \frac{1}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 0.0:\\ \;\;\;\;\frac{a1}{\frac{b2 \cdot b1}{a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le 4.15369418345865 \cdot 10^{+157}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1} \cdot \frac{1}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{\frac{b2 \cdot b1}{a2}}\\ \end{array}\]

Reproduce

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

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

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