Average Error: 10.8 → 5.2
Time: 7.7s
Precision: 64
Internal Precision: 128
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;b1 \cdot b2 \le -2.589198304171334 \cdot 10^{+296}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;b1 \cdot b2 \le -2.4602492454623204 \cdot 10^{-240}:\\ \;\;\;\;\left(a2 \cdot a1\right) \cdot \frac{1}{b1 \cdot b2}\\ \mathbf{elif}\;b1 \cdot b2 \le 2.4341944931411 \cdot 10^{-314}:\\ \;\;\;\;\frac{1}{\frac{b1}{a1} \cdot \frac{b2}{a2}}\\ \mathbf{elif}\;b1 \cdot b2 \le 4.382268559785013 \cdot 10^{+274}:\\ \;\;\;\;\left(a2 \cdot a1\right) \cdot \frac{1}{b1 \cdot b2}\\ \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.8
Target11.0
Herbie5.2
\[\frac{a1}{b1} \cdot \frac{a2}{b2}\]

Derivation

  1. Split input into 3 regimes
  2. if (* b1 b2) < -2.589198304171334e+296 or 4.382268559785013e+274 < (* b1 b2)

    1. Initial program 19.1

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

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

    if -2.589198304171334e+296 < (* b1 b2) < -2.4602492454623204e-240 or 2.4341944931411e-314 < (* b1 b2) < 4.382268559785013e+274

    1. Initial program 5.4

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

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

    if -2.4602492454623204e-240 < (* b1 b2) < 2.4341944931411e-314

    1. Initial program 45.5

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Using strategy rm
    3. Applied clear-num45.5

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;b1 \cdot b2 \le -2.589198304171334 \cdot 10^{+296}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;b1 \cdot b2 \le -2.4602492454623204 \cdot 10^{-240}:\\ \;\;\;\;\left(a2 \cdot a1\right) \cdot \frac{1}{b1 \cdot b2}\\ \mathbf{elif}\;b1 \cdot b2 \le 2.4341944931411 \cdot 10^{-314}:\\ \;\;\;\;\frac{1}{\frac{b1}{a1} \cdot \frac{b2}{a2}}\\ \mathbf{elif}\;b1 \cdot b2 \le 4.382268559785013 \cdot 10^{+274}:\\ \;\;\;\;\left(a2 \cdot a1\right) \cdot \frac{1}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \end{array}\]

Reproduce

herbie shell --seed 2019016 +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.7s)Debug log

sample65.0ms

Algorithm
intervals
Results
335×(pre true 80)
335×(body real 80)

simplify31.0ms

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

prune6.0ms

Pruning

1 alts after pruning (1 fresh and 0 done)

Merged error: 8.9b

localize11.0ms

Local error

Found 1 expressions with local error:

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

series32.0ms

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

simplify368.0ms

Counts
7 → 20
Calls
7 calls:
Slowest
203.0ms
(/ (* (* (* a1 a2) (* a1 a2)) (* a1 a2)) (* (* (* b1 b2) (* b1 b2)) (* b1 b2)))
56.0ms
(- (log (* a1 a2)) (log (* b1 b2)))
40.0ms
(/ (* a1 a2) (* b2 b1))
33.0ms
(/ (* a1 a2) (* b2 b1))
32.0ms
(/ (* a1 a2) (* b2 b1))

prune220.0ms

Pruning

7 alts after pruning (6 fresh and 1 done)

Merged error: 0.1b

localize14.0ms

Local error

Found 2 expressions with local error:

9.2b
(* (* a1 a2) (/ 1 (* b1 b2)))
0.2b
(/ 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))

series41.0ms

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

simplify1.1s

Counts
17 → 43
Calls
17 calls:
Slowest
481.0ms
(* (* a1 a2) (/ 1 (* b1 b2)))
313.0ms
(+ (log (* a1 a2)) (log (/ 1 (* b1 b2))))
106.0ms
(* (* (* (* a1 a2) (* a1 a2)) (* a1 a2)) (* (* (/ 1 (* b1 b2)) (/ 1 (* b1 b2))) (/ 1 (* b1 b2))))
101.0ms
(+ (log (* a1 a2)) (- (log (* b1 b2))))
23.0ms
(/ (* a1 a2) (* b2 b1))

prune548.0ms

Pruning

9 alts after pruning (7 fresh and 2 done)

Merged error: 0.0b

localize11.0ms

Local error

Found 2 expressions with local error:

8.7b
(/ (* b1 b2) (* a1 a2))
0.8b
(/ 1 (/ (* b1 b2) (* a1 a2)))

rewrite9.0ms

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

series49.0ms

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

simplify415.0ms

Counts
17 → 45
Calls
17 calls:
Slowest
122.0ms
(/ (* (* (* b1 b2) (* b1 b2)) (* b1 b2)) (* (* (* a1 a2) (* a1 a2)) (* a1 a2)))
55.0ms
(cbrt (/ (* b1 b2) (* a1 a2)))
49.0ms
(sqrt (/ (* b1 b2) (* a1 a2)))
44.0ms
(- (log (* b1 b2)) (log (* a1 a2)))
31.0ms
(/ (* b1 b2) (* a1 a2))

prune510.0ms

Pruning

10 alts after pruning (8 fresh and 2 done)

Merged error: 0.0b

localize17.0ms

Local error

Found 3 expressions with local error:

5.8b
(/ (/ (* b1 b2) a1) a2)
5.0b
(/ (* b1 b2) a1)
0.8b
(/ 1 (/ (/ (* b1 b2) a1) a2))

rewrite16.0ms

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

series96.0ms

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

simplify444.0ms

Counts
18 → 59
Calls
18 calls:
Slowest
67.0ms
(/ (/ (* b1 b2) a1) a2)
63.0ms
(sqrt (/ (/ (* b1 b2) a1) a2))
35.0ms
(cbrt (/ (/ (* b1 b2) a1) a2))
34.0ms
(/ (* b2 b1) (* a1 a2))
34.0ms
(/ (* b2 b1) (* a1 a2))

prune516.0ms

Pruning

9 alts after pruning (7 fresh and 2 done)

Merged error: 0.0b

regimes733.0ms

Accuracy

53% (5.2b remaining)

Error of 5.2b against oracle of 0.0b and baseline of 11.0b

bsearch6.0ms

end0.0ms

sample1.4s

Algorithm
intervals
Results
10004×(pre true 80)
10004×(body real 80)