Average Error: 11.3 → 2.2
Time: 5.2s
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 inf 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 inf 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 +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: 4.1s)Debug log

sample30.0ms

Algorithm
intervals
Results
20.0ms313×body80valid

simplify38.0ms

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

prune10.0ms

Pruning

1 alts after pruning (1 fresh and 0 done)

Merged error: 10.5b

localize13.0ms

Local error

Found 1 expressions with local error:

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

series21.0ms

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

simplify260.0ms

Counts
7 → 20
Calls
7 calls:
Slowest
136.0ms
(/ (* (* (* a1 a2) (* a1 a2)) (* a1 a2)) (* (* (* b1 b2) (* b1 b2)) (* b1 b2)))
60.0ms
(- (log (* a1 a2)) (log (* b1 b2)))
27.0ms
(/ (* a1 a2) (* b2 b1))
18.0ms
(/ (* a1 a2) (* b2 b1))
17.0ms
(/ (* a1 a2) (* b2 b1))

prune234.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))

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
5.0ms
(/ (* a1 a2) (* b2 b1))

series25.0ms

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

simplify320.0ms

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

prune223.0ms

Pruning

8 alts after pruning (7 fresh and 1 done)

Merged error: 0.0b

localize7.0ms

Local error

Found 2 expressions with local error:

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

rewrite6.0ms

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

series41.0ms

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

simplify153.0ms

Counts
10 → 36
Calls
10 calls:
Slowest
35.0ms
(/ (* a1 a2) (* b2 b1))
26.0ms
(/ (* a1 a2) (* b2 b1))
22.0ms
(* (cbrt (/ (* a1 a2) b1)) (cbrt (/ (* a1 a2) b1)))
17.0ms
(/ (* a1 a2) (* b2 b1))
15.0ms
(sqrt (/ (* a1 a2) b1))

prune290.0ms

Pruning

9 alts after pruning (7 fresh and 2 done)

Merged error: 0.0b

localize10.0ms

Local error

Found 2 expressions with local error:

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

rewrite13.0ms

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

series39.0ms

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

simplify115.0ms

Counts
10 → 36
Calls
10 calls:
Slowest
23.0ms
(/ (* a1 a2) (* b2 b1))
21.0ms
(/ (* a1 a2) (* b2 b1))
17.0ms
(/ (* a1 a2) (* b2 b1))
14.0ms
(* (cbrt (/ (* a1 a2) b2)) (cbrt (/ (* a1 a2) b2)))
11.0ms
(sqrt (/ (* a1 a2) b2))

prune256.0ms

Pruning

9 alts after pruning (6 fresh and 3 done)

Merged error: 0.0b

regimes890.0ms

Accuracy

80.8% (2.2b remaining)

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

bsearch7.0ms

end0.0ms

sample1.1s

Algorithm
intervals
Results
865.0ms10005×body80valid