Average Error: 10.9 → 5.4
Time: 7.2s
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 
(FPCore (a1 a2 b1 b2)
  :name "Quotient of products"

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

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

Details

Time bar (total: 6.3s)Debug log

sample37.0ms

Algorithm
intervals

simplify47.0ms

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

prune11.0ms

Pruning

1 alts after pruning (1 fresh and 0 done)

Merged error: 9.3b

localize19.0ms

Local error

Found 1 expressions with local error:

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

rewrite5.0ms

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

series34.0ms

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

simplify348.0ms

Counts
7 → 18
Calls
7 calls:
Slowest
181.0ms
(/ (* (* (* a1 a2) (* a1 a2)) (* a1 a2)) (* (* (* b1 b2) (* b1 b2)) (* b1 b2)))
63.0ms
(- (log (* a1 a2)) (log (* b1 b2)))
34.0ms
(/ (* a1 a2) (* b2 b1))
33.0ms
(/ (* a1 a2) (* b2 b1))
33.0ms
(/ (* a1 a2) (* b2 b1))

prune183.0ms

Pruning

9 alts after pruning (8 fresh and 1 done)

Merged error: 0.0b

localize5.0ms

Local error

Found 2 expressions with local error:

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

rewrite5.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
prod-exp
rec-exp
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 → 33
Calls
2 calls:
Slowest
4.0ms
(* (* a1 a2) (/ 1 (* b1 b2)))
1.0ms
(/ 1 (* b1 b2))

series28.0ms

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

simplify1.1s

Counts
17 → 39
Calls
17 calls:
Slowest
503.0ms
(* (* a1 a2) (/ 1 (* b1 b2)))
319.0ms
(+ (log (* a1 a2)) (log (/ 1 (* b1 b2))))
95.0ms
(+ (log (* a1 a2)) (- (log (* b1 b2))))
78.0ms
(* (* (* (* a1 a2) (* a1 a2)) (* a1 a2)) (* (* (/ 1 (* b1 b2)) (/ 1 (* b1 b2))) (/ 1 (* b1 b2))))
30.0ms
(/ (* a1 a2) (* b2 b1))

prune424.0ms

Pruning

9 alts after pruning (9 fresh and 0 done)

Merged error: 0.0b

localize8.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
associate-/l/
cbrt-unprod
*-commutative
associate-*r/
prod-exp
pow-prod-down
associate-*l*
frac-2neg
clear-num
Counts
2 → 32
Calls
2 calls:
Slowest
7.0ms
(* (* a1 a2) (/ (/ 1 b1) b2))
4.0ms
(/ (/ 1 b1) b2)

series31.0ms

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

simplify699.0ms

Counts
15 → 38
Calls
15 calls:
Slowest
340.0ms
(+ (log (* a1 a2)) (log (/ (/ 1 b1) b2)))
146.0ms
(* (* a1 a2) (/ (/ 1 b1) b2))
77.0ms
(* (* (* (* a1 a2) (* a1 a2)) (* a1 a2)) (* (* (/ (/ 1 b1) b2) (/ (/ 1 b1) b2)) (/ (/ 1 b1) b2)))
38.0ms
(/ (* a1 a2) (* b2 b1))
34.0ms
(/ (* a1 a2) (* b2 b1))

prune359.0ms

Pruning

9 alts after pruning (8 fresh and 1 done)

Merged error: 0.0b

localize10.0ms

Local error

Found 1 expressions with local error:

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

rewrite5.0ms

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

series30.0ms

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

simplify298.0ms

Counts
7 → 18
Calls
7 calls:
Slowest
169.0ms
(/ (* (* (* a1 a2) (* a1 a2)) (* a1 a2)) (* (* (* b2 b1) (* b2 b1)) (* b2 b1)))
43.0ms
(- (log (* a1 a2)) (log (* b2 b1)))
33.0ms
(/ (* a1 a2) (* b2 b1))
33.0ms
(/ (* a1 a2) (* b2 b1))
17.0ms
(/ (* a1 a2) (* b2 b1))

prune169.0ms

Pruning

9 alts after pruning (7 fresh and 2 done)

Merged error: 0.0b

regimes823.0ms

Accuracy

50.3% (5.4b remaining)

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

bsearch7.0ms

end0.0ms

sample1.6s

Algorithm
intervals