-
Notifications
You must be signed in to change notification settings - Fork 3
/
index.js
60 lines (57 loc) · 1.36 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
'use strict'
var isRat = require('./is-rat')
var isBN = require('./lib/is-bn')
var num2bn = require('./lib/num-to-bn')
var str2bn = require('./lib/str-to-bn')
var rationalize = require('./lib/rationalize')
var div = require('./div')
module.exports = makeRational
function makeRational(numer, denom) {
if(isRat(numer)) {
if(denom) {
return div(numer, makeRational(denom))
}
return [numer[0].clone(), numer[1].clone()]
}
var shift = 0
var a, b
if(isBN(numer)) {
a = numer.clone()
} else if(typeof numer === 'string') {
a = str2bn(numer)
} else if(numer === 0) {
return [num2bn(0), num2bn(1)]
} else if(numer === Math.floor(numer)) {
a = num2bn(numer)
} else {
while(numer !== Math.floor(numer)) {
numer = numer * Math.pow(2, 256)
shift -= 256
}
a = num2bn(numer)
}
if(isRat(denom)) {
a.mul(denom[1])
b = denom[0].clone()
} else if(isBN(denom)) {
b = denom.clone()
} else if(typeof denom === 'string') {
b = str2bn(denom)
} else if(!denom) {
b = num2bn(1)
} else if(denom === Math.floor(denom)) {
b = num2bn(denom)
} else {
while(denom !== Math.floor(denom)) {
denom = denom * Math.pow(2, 256)
shift += 256
}
b = num2bn(denom)
}
if(shift > 0) {
a = a.ushln(shift)
} else if(shift < 0) {
b = b.ushln(-shift)
}
return rationalize(a, b)
}