Average Error: 11.3 → 2.2
Time: 5.1s
Precision: 64
Internal Precision: 128
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -2.2845054729502 \cdot 10^{-312}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 4.506587229492748 \cdot 10^{-292}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 4.736445781412451 \cdot 10^{+290}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{b2} \cdot \frac{a2}{b1}\\ \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

Original11.3
Target10.7
Herbie2.2
\[\frac{a1}{b1} \cdot \frac{a2}{b2}\]

Derivation

  1. Split input into 3 regimes
  2. if (/ (* a1 a2) (* b1 b2)) < -inf.0 or -2.2845054729502e-312 < (/ (* a1 a2) (* b1 b2)) < 4.506587229492748e-292

    1. Initial program 17.6

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

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

    if -inf.0 < (/ (* a1 a2) (* b1 b2)) < -2.2845054729502e-312 or 4.506587229492748e-292 < (/ (* a1 a2) (* b1 b2)) < 4.736445781412451e+290

    1. Initial program 0.7

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Taylor expanded around 0 0.7

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

    if 4.736445781412451e+290 < (/ (* a1 a2) (* b1 b2))

    1. Initial program 56.4

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Taylor expanded around 0 56.4

      \[\leadsto \color{blue}{\frac{a1 \cdot a2}{b2 \cdot b1}}\]
    3. Using strategy rm
    4. Applied times-frac7.7

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -2.2845054729502 \cdot 10^{-312}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 4.506587229492748 \cdot 10^{-292}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 4.736445781412451 \cdot 10^{+290}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{b2} \cdot \frac{a2}{b1}\\ \end{array}\]

Reproduce

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

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

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

Details

Time bar (total: 4.2s)Debug log

sample28.0ms

Algorithm
intervals
Results
17.0ms313×body80valid

simplify39.0ms

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

prune9.0ms

Pruning

1 alts after pruning (1 fresh and 0 done)

Merged error: 10.5b

localize18.0ms

Local error

Found 1 expressions with local error:

10.5b
(/ (* 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))

series33.0ms

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

simplify283.0ms

Counts
7 → 18
Calls
7 calls:
Slowest
124.0ms
(/ (* (* (* a1 a2) (* a1 a2)) (* a1 a2)) (* (* (* b1 b2) (* b1 b2)) (* b1 b2)))
69.0ms
(- (log (* a1 a2)) (log (* b1 b2)))
30.0ms
(/ (* a1 a2) (* b2 b1))
28.0ms
(/ (* a1 a2) (* b2 b1))
28.0ms
(/ (* a1 a2) (* b2 b1))

prune169.0ms

Pruning

7 alts after pruning (7 fresh and 0 done)

Merged error: 0.1b

localize10.0ms

Local error

Found 1 expressions with local error:

10.5b
(/ (* 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))

series33.0ms

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

simplify655.0ms

Counts
7 → 18
Calls
7 calls:
Slowest
390.0ms
(/ (* a1 a2) (* b2 b1))
145.0ms
(/ (* (* (* a1 a2) (* a1 a2)) (* a1 a2)) (* (* (* b2 b1) (* b2 b1)) (* b2 b1)))
80.0ms
(- (log (* a1 a2)) (log (* b2 b1)))
21.0ms
(/ (* a1 a2) (* b2 b1))
16.0ms
(/ (* a1 a2) (* b2 b1))

prune157.0ms

Pruning

8 alts after pruning (7 fresh and 1 done)

Merged error: 0.0b

localize9.0ms

Local error

Found 2 expressions with local error:

6.5b
(/ (/ (* a1 a2) b1) b2)
4.7b
(/ (* a1 a2) b1)

rewrite11.0ms

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

series40.0ms

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

simplify134.0ms

Counts
10 → 32
Calls
10 calls:
Slowest
27.0ms
(/ (* a1 a2) (* b2 b1))
25.0ms
(/ (* a1 a2) (* b2 b1))
18.0ms
(/ (* a1 a2) (* b2 b1))
14.0ms
(sqrt (/ (* a1 a2) b1))
14.0ms
(* (cbrt (/ (* a1 a2) b1)) (cbrt (/ (* a1 a2) b1)))

prune243.0ms

Pruning

9 alts after pruning (7 fresh and 2 done)

Merged error: 0.0b

localize5.0ms

Local error

Found 2 expressions with local error:

7.4b
(/ (/ (* a1 a2) b2) b1)
5.5b
(/ (* a1 a2) b2)

rewrite7.0ms

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

series34.0ms

Counts
2 → 6
Calls
2 calls:
Slowest
20.0ms
(/ (/ (* a1 a2) b2) b1)
15.0ms
(/ (* a1 a2) b2)

simplify103.0ms

Counts
10 → 32
Calls
10 calls:
Slowest
20.0ms
(* (cbrt (/ (* a1 a2) b2)) (cbrt (/ (* a1 a2) b2)))
17.0ms
(/ (* a1 a2) (* b2 b1))
16.0ms
(/ (* a1 a2) (* b2 b1))
16.0ms
(/ (* a1 a2) (* b2 b1))
9.0ms
(/ (* a1 a2) b2)

prune257.0ms

Pruning

9 alts after pruning (6 fresh and 3 done)

Merged error: 0.0b

regimes758.0ms

Accuracy

80.8% (2.2b remaining)

Error of 2.2b against oracle of 0.0b and baseline of 11.3b

bsearch8.0ms

end0.0ms

sample1.1s

Algorithm
intervals
Results
869.0ms10005×body80valid