Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@mraleph
Last active December 23, 2015 00:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mraleph/6555146 to your computer and use it in GitHub Desktop.
Save mraleph/6555146 to your computer and use it in GitHub Desktop.
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