Last active
December 23, 2015 00:39
-
-
Save mraleph/6555146 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var pi = (function () { | |
var NTP = 25; | |
var tp = []; | |
tp[0] = 1.; | |
for (var i = 1; i < NTP; i++) tp[i] = 2. * tp[i-1]; | |
function series(m, id) { | |
var s = 0; | |
var eps = 0.00000000000000001; | |
/* Sum the series up to id. */ | |
for (var k = 0; k < id; k++){ | |
var ak = 8 * k + m; | |
var p = id - k; | |
var t = expm(p, ak); | |
s = s + t / ak; | |
s = s - Math.floor(s); | |
} | |
/* Compute a few terms where k >= id. */ | |
for (var k = id; k <= id + 100; k++){ | |
var ak = 8 * k + m; | |
var t = Math.pow (16, id - k) / ak; | |
if (t < eps) break; | |
s = s + t; | |
s = s - Math.floor(s); | |
} | |
return s; | |
} | |
function expm (p, ak) { | |
if (ak == 1.) return 0.; | |
/* Find the greatest power of two less than or equal to p. */ | |
for (var i = 0; i < tp.length; i++) { | |
if (tp[i] > p) break; | |
} | |
var pt = tp[i-1]; | |
var p1 = p; | |
var r = 1.; | |
/* Perform binary exponentiation algorithm modulo ak. */ | |
for (var j = 1; j <= i; j++){ | |
if (p1 >= pt){ | |
r = 16. * r; | |
r = r - Math.floor(r / ak) * ak; | |
p1 = p1 - pt; | |
} | |
pt = 0.5 * pt; | |
if (pt >= 1.){ | |
r = r * r; | |
r = r - Math.floor(r / ak) * ak; | |
} | |
} | |
return r; | |
} | |
function ihex(x, nhx, chx) { | |
var i, y, hx = "0123456789ABCDEF"; | |
y = Math.abs(x); | |
for (i = 0; i < nhx; i++) { | |
y = 16. * (y - (y | 0)); | |
chx[i] = hx[y | 0]; | |
} | |
} | |
function pi(id) { | |
var pid, s1, s2, s3, s4 | |
, hex = []; | |
s1 = series(1, id); | |
s2 = series(4, id); | |
s3 = series(5, id); | |
s4 = series(6, id); | |
pid = 4 * s1 - 2 * s2 - s3 - s4; | |
pid = pid - (pid | 0) + 1; | |
ihex(pid, 16, hex); | |
return { | |
hex: hex.join('').substr(0, 10), | |
fraction:pid | |
}; | |
} | |
return pi; | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment