Average Error: 10.9 → 5.4
Time: 7.8s
Precision: 64
Internal Precision: 128
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;a1 \cdot a2 = -\infty:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -2.632195272802239 \cdot 10^{-178}:\\ \;\;\;\;\left(a1 \cdot a2\right) \cdot \frac{\frac{1}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 0.0:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 1.4431123399596268 \cdot 10^{+161}:\\ \;\;\;\;\frac{a1 \cdot a2}{b2 \cdot b1}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \end{array}\]

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.9
Target11.2
Herbie5.4
\[\frac{a1}{b1} \cdot \frac{a2}{b2}\]

Derivation

  1. Split input into 3 regimes
  2. if (* a1 a2) < -inf.0 or -2.632195272802239e-178 < (* a1 a2) < 0.0 or 1.4431123399596268e+161 < (* a1 a2)

    1. Initial program 22.6

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

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

    if -inf.0 < (* a1 a2) < -2.632195272802239e-178

    1. Initial program 5.2

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

      \[\leadsto \color{blue}{\left(a1 \cdot a2\right) \cdot \frac{1}{b1 \cdot b2}}\]
    4. Using strategy rm
    5. Applied associate-/r*5.1

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

    if 0.0 < (* a1 a2) < 1.4431123399596268e+161

    1. Initial program 4.8

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Using strategy rm
    3. Applied div-inv5.1

      \[\leadsto \color{blue}{\left(a1 \cdot a2\right) \cdot \frac{1}{b1 \cdot b2}}\]
    4. Using strategy rm
    5. Applied associate-/r*4.9

      \[\leadsto \left(a1 \cdot a2\right) \cdot \color{blue}{\frac{\frac{1}{b1}}{b2}}\]
    6. Taylor expanded around inf 4.8

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;a1 \cdot a2 = -\infty:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -2.632195272802239 \cdot 10^{-178}:\\ \;\;\;\;\left(a1 \cdot a2\right) \cdot \frac{\frac{1}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 0.0:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 1.4431123399596268 \cdot 10^{+161}:\\ \;\;\;\;\frac{a1 \cdot a2}{b2 \cdot b1}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \end{array}\]

Reproduce

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

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

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

Details

Time bar (total: 6.6s)Debug log

sample31.0ms

Algorithm
intervals

simplify24.0ms

Counts
1 → 1
Calls
1 calls:
Slowest
24.0ms
(/ (* a1 a2) (* b1 b2))

prune6.0ms

Pruning

1 alts after pruning (1 fresh and 0 done)

Merged error: 9.3b

localize11.0ms

Local error

Found 1 expressions with local error:

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

rewrite3.0ms

Algorithm
rewrite-expression-head
Rules
add-exp-log
add-cbrt-cube
add-log-exp
associate-/l*
div-inv
log1p-expm1-u
add-cube-cbrt
div-exp
times-frac
*-un-lft-identity
frac-2neg
associate-/r*
clear-num
cbrt-undiv
pow1
expm1-log1p-u
add-sqr-sqrt
Counts
1 → 17
Calls
1 calls:
Slowest
3.0ms
(/ (* a1 a2) (* b1 b2))

series20.0ms

Counts
1 → 3
Calls
1 calls:
Slowest
20.0ms
(/ (* a1 a2) (* b1 b2))

simplify357.0ms

Counts
7 → 20
Calls
7 calls:
Slowest
188.0ms
(/ (* (* (* a1 a2) (* a1 a2)) (* a1 a2)) (* (* (* b1 b2) (* b1 b2)) (* b1 b2)))
62.0ms
(- (log (* a1 a2)) (log (* b1 b2)))
36.0ms
(/ (* a1 a2) (* b2 b1))
34.0ms
(/ (* a1 a2) (* b2 b1))
34.0ms
(/ (* a1 a2) (* b2 b1))

prune284.0ms

Pruning

9 alts after pruning (8 fresh and 1 done)

Merged error: 0.0b

localize12.0ms

Local error

Found 2 expressions with local error:

9.1b
(* (* a1 a2) (/ 1 (* b1 b2)))
0.7b
(/ 1 (* b1 b2))

rewrite10.0ms

Algorithm
rewrite-expression-head
Rules
add-exp-log
pow1
associate-*r*
add-cbrt-cube
add-cube-cbrt
*-un-lft-identity
add-sqr-sqrt
add-log-exp
div-inv
log1p-expm1-u
prod-exp
rec-exp
expm1-log1p-u
inv-pow
pow-flip
cbrt-unprod
*-commutative
un-div-inv
associate-*r/
pow-prod-down
associate-*l*
frac-2neg
associate-/r*
clear-num
Counts
2 → 37
Calls
2 calls:
Slowest
8.0ms
(* (* a1 a2) (/ 1 (* b1 b2)))
1.0ms
(/ 1 (* b1 b2))

series44.0ms

Counts
2 → 6
Calls
2 calls:
Slowest
33.0ms
(* (* a1 a2) (/ 1 (* b1 b2)))
12.0ms
(/ 1 (* b1 b2))

simplify996.0ms

Counts
17 → 43
Calls
17 calls:
Slowest
421.0ms
(* (* a1 a2) (/ 1 (* b1 b2)))
274.0ms
(+ (log (* a1 a2)) (log (/ 1 (* b1 b2))))
121.0ms
(+ (log (* a1 a2)) (- (log (* b1 b2))))
99.0ms
(* (* (* (* a1 a2) (* a1 a2)) (* a1 a2)) (* (* (/ 1 (* b1 b2)) (/ 1 (* b1 b2))) (/ 1 (* b1 b2))))
20.0ms
(/ (* a1 a2) (* b2 b1))

prune486.0ms

Pruning

9 alts after pruning (9 fresh and 0 done)

Merged error: 0.0b

localize19.0ms

Local error

Found 2 expressions with local error:

9.1b
(* (* a1 a2) (/ (/ 1 b1) b2))
0.2b
(/ (/ 1 b1) b2)

rewrite13.0ms

Algorithm
rewrite-expression-head
Rules
associate-/l*
add-cube-cbrt
add-exp-log
associate-*r*
add-cbrt-cube
*-un-lft-identity
pow1
add-sqr-sqrt
div-inv
add-log-exp
log1p-expm1-u
expm1-log1p-u
associate-/l/
cbrt-unprod
*-commutative
associate-*r/
prod-exp
pow-prod-down
associate-*l*
frac-2neg
clear-num
Counts
2 → 36
Calls
2 calls:
Slowest
8.0ms
(* (* a1 a2) (/ (/ 1 b1) b2))
5.0ms
(/ (/ 1 b1) b2)

series47.0ms

Counts
2 → 6
Calls
2 calls:
Slowest
35.0ms
(* (* a1 a2) (/ (/ 1 b1) b2))
11.0ms
(/ (/ 1 b1) b2)

simplify990.0ms

Counts
15 → 42
Calls
15 calls:
Slowest
649.0ms
(+ (log (* a1 a2)) (log (/ (/ 1 b1) b2)))
147.0ms
(* (* a1 a2) (/ (/ 1 b1) b2))
84.0ms
(* (* (* (* a1 a2) (* a1 a2)) (* a1 a2)) (* (* (/ (/ 1 b1) b2) (/ (/ 1 b1) b2)) (/ (/ 1 b1) b2)))
30.0ms
(/ (* a1 a2) (* b2 b1))
22.0ms
(/ (* a1 a2) (* b2 b1))

prune438.0ms

Pruning

9 alts after pruning (8 fresh and 1 done)

Merged error: 0.0b

localize11.0ms

Local error

Found 1 expressions with local error:

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

rewrite6.0ms

Algorithm
rewrite-expression-head
Rules
add-exp-log
add-cbrt-cube
add-log-exp
associate-/l*
div-inv
log1p-expm1-u
add-cube-cbrt
div-exp
times-frac
*-un-lft-identity
frac-2neg
associate-/r*
clear-num
cbrt-undiv
pow1
expm1-log1p-u
add-sqr-sqrt
Counts
1 → 17
Calls
1 calls:
Slowest
6.0ms
(/ (* a1 a2) (* b2 b1))

series25.0ms

Counts
1 → 3
Calls
1 calls:
Slowest
25.0ms
(/ (* a1 a2) (* b2 b1))

simplify359.0ms

Counts
7 → 20
Calls
7 calls:
Slowest
221.0ms
(/ (* (* (* a1 a2) (* a1 a2)) (* a1 a2)) (* (* (* b2 b1) (* b2 b1)) (* b2 b1)))
71.0ms
(- (log (* a1 a2)) (log (* b2 b1)))
23.0ms
(/ (* a1 a2) (* b2 b1))
23.0ms
(/ (* a1 a2) (* b2 b1))
17.0ms
(/ (* a1 a2) (* b2 b1))

prune222.0ms

Pruning

9 alts after pruning (7 fresh and 2 done)

Merged error: 0.0b

regimes781.0ms

Accuracy

50.3% (5.4b remaining)

Error of 5.4b against oracle of 0.0b and baseline of 10.9b

bsearch4.0ms

end0.0ms

sample1.4s

Algorithm
intervals