Average Error: 11.1 → 6.7
Time: 2.2s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -6.67328305695128662 \cdot 10^{298}:\\ \;\;\;\;\frac{a1}{\frac{b1 \cdot b2}{a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le -9.9624359391974792 \cdot 10^{-63}:\\ \;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 6.4125112865997151 \cdot 10^{-110}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 9.89298998926045652 \cdot 10^{206}:\\ \;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}{b2}\\ \mathbf{else}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b2}}{b1}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;a1 \cdot a2 \le -6.67328305695128662 \cdot 10^{298}:\\
\;\;\;\;\frac{a1}{\frac{b1 \cdot b2}{a2}}\\

\mathbf{elif}\;a1 \cdot a2 \le -9.9624359391974792 \cdot 10^{-63}:\\
\;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}{b2}\\

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

\mathbf{elif}\;a1 \cdot a2 \le 9.89298998926045652 \cdot 10^{206}:\\
\;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}{b2}\\

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r148653 = a1;
        double r148654 = a2;
        double r148655 = r148653 * r148654;
        double r148656 = b1;
        double r148657 = b2;
        double r148658 = r148656 * r148657;
        double r148659 = r148655 / r148658;
        return r148659;
}

double f(double a1, double a2, double b1, double b2) {
        double r148660 = a1;
        double r148661 = a2;
        double r148662 = r148660 * r148661;
        double r148663 = -6.673283056951287e+298;
        bool r148664 = r148662 <= r148663;
        double r148665 = b1;
        double r148666 = b2;
        double r148667 = r148665 * r148666;
        double r148668 = r148667 / r148661;
        double r148669 = r148660 / r148668;
        double r148670 = -9.96243593919748e-63;
        bool r148671 = r148662 <= r148670;
        double r148672 = 1.0;
        double r148673 = r148672 / r148665;
        double r148674 = r148662 * r148673;
        double r148675 = r148674 / r148666;
        double r148676 = 6.412511286599715e-110;
        bool r148677 = r148662 <= r148676;
        double r148678 = r148660 / r148665;
        double r148679 = r148661 / r148666;
        double r148680 = r148678 * r148679;
        double r148681 = 9.892989989260457e+206;
        bool r148682 = r148662 <= r148681;
        double r148683 = r148679 / r148665;
        double r148684 = r148660 * r148683;
        double r148685 = r148682 ? r148675 : r148684;
        double r148686 = r148677 ? r148680 : r148685;
        double r148687 = r148671 ? r148675 : r148686;
        double r148688 = r148664 ? r148669 : r148687;
        return r148688;
}

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

Original11.1
Target11.5
Herbie6.7
\[\frac{a1}{b1} \cdot \frac{a2}{b2}\]

Derivation

  1. Split input into 4 regimes
  2. if (* a1 a2) < -6.673283056951287e+298

    1. Initial program 60.1

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

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

    if -6.673283056951287e+298 < (* a1 a2) < -9.96243593919748e-63 or 6.412511286599715e-110 < (* a1 a2) < 9.892989989260457e+206

    1. Initial program 4.9

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

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

      \[\leadsto \frac{\color{blue}{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}}{b2}\]

    if -9.96243593919748e-63 < (* a1 a2) < 6.412511286599715e-110

    1. Initial program 11.3

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

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

    if 9.892989989260457e+206 < (* a1 a2)

    1. Initial program 31.4

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

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

      \[\leadsto \color{blue}{\left(a1 \cdot \frac{1}{b1}\right)} \cdot \frac{a2}{b2}\]
    6. Applied associate-*l*8.8

      \[\leadsto \color{blue}{a1 \cdot \left(\frac{1}{b1} \cdot \frac{a2}{b2}\right)}\]
    7. Simplified8.7

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -6.67328305695128662 \cdot 10^{298}:\\ \;\;\;\;\frac{a1}{\frac{b1 \cdot b2}{a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le -9.9624359391974792 \cdot 10^{-63}:\\ \;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 6.4125112865997151 \cdot 10^{-110}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 9.89298998926045652 \cdot 10^{206}:\\ \;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}{b2}\\ \mathbf{else}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b2}}{b1}\\ \end{array}\]

Reproduce

herbie shell --seed 2020035 +o rules:numerics
(FPCore (a1 a2 b1 b2)
  :name "Quotient of products"
  :precision binary64

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

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