double series (int m, int id) /* This routine evaluates the series sum_k 16^(id-k)/(8*k+m) using the modular exponentiation technique. */ { int k; double ak, eps, p, s, t; double expm (double x, double y); #define eps 1e-17 s = 0.; /* Sum the series up to id. */ for (k = 0; k < id; k++){ ak = 8 * k + m; p = id - k; t = expm (p, ak); s = s + t / ak; s = s - (int) s; } /* Compute a few terms where k >= id. */ for (k = id; k <= id + 100; k++){ ak = 8 * k + m; t = pow (16., (double) (id - k)) / ak; if (t < eps) break; s = s + t; s = s - (int) s; } return s; } double expm (double p, double ak) /* expm = 16^p mod ak. This routine uses the left-to-right binary exponentiation scheme. */ { int i, j; double p1, pt, r; #define ntp 25 static double tp[ntp]; static int tp1 = 0; /* If this is the first call to expm, fill the power of two table tp. */ if (tp1 == 0) { tp1 = 1; tp[0] = 1.; for (i = 1; i < ntp; i++) tp[i] = 2. * tp[i-1]; } if (ak == 1.) return 0.; /* Find the greatest power of two less than or equal to p. */ for (i = 0; i < ntp; i++) if (tp[i] > p) break; pt = tp[i-1]; p1 = p; r = 1.; /* Perform binary exponentiation algorithm modulo ak. */ for (j = 1; j <= i; j++){ if (p1 >= pt){ r = 16. * r; r = r - (int) (r / ak) * ak; p1 = p1 - pt; } pt = 0.5 * pt; if (pt >= 1.){ r = r * r; r = r - (int) (r / ak) * ak; } } return r; }
(function (window) { "use strict"; // var buffer = new ArrayBuffer(BUFFER_SIZE); // var functionNameOrStuctureName = (function (stdlib, env, heap) { "use asm"; // // return { methodNameExport: methodNameInModule, methodName2Export: methodName2InModule, }; // return methodNameInModule })( { // (stdlib) Uint8Array: Uint8Array, Int8Array: Int8Array, Uint16Array: Uint16Array, Int16Array: Int16Array, Uint32Array: Uint32Array, Int32Array: Int32Array, Float32Array:Float32Array, Float64Array:Float64Array, Math: Math }, { // (env) NTP:NTP }, buffer // , , > 4096 0 ); })(window); // wrapper end
function f1(i, d) { i = i | 0; // integer , i d = +d; // double , d var char = new Uint8Array(heap); // , var i2 = 0; // ( fixnum) var d2 = 0.0; // i2 = i2 | 0; // fixnum integer return +d2; // double double }
"use asm"; // stdlib var floor = stdlib.Math.floor; // , var pow = stdlib.Math.pow; // , var tp1 = 0; // var tp = new stdlib.Float64Array(heap); // var ntp = env.NTP | 0; // env,
function expm(p, ak) { // }
function expm(p, ak) { p = +p; ak = +ak; var i = 0; var pt = 0.0; // .... i = i | 0; ntp = ntp | 0; // }
if ((tp1 | 0) == 0) { // vars for (i = 1; (i | 0) < (ntp | 0); i = (i | 0) + 1 | 0) { // surprise, read more) } }
arr[i] = +1;
arr[i >> 2] = +1;
arr[i << 3 >> 3] = +1;
/** * Created with JetBrains WebStorm. * User: louter * Date: 12.09.13 * Time: 17:49 */ (function (window) { "use strict"; var ihex; var NTP = 25; var buffer = new ArrayBuffer(1024 * 1024 * 8); var series = (function (stdlib, env, heap) { "use asm"; var floor = stdlib.Math.floor; var pow = stdlib.Math.pow; var tp1 = 0; var tp = new stdlib.Float64Array(heap); var ntp = env.NTP | 0; function expm(p, ak) { p = +p; ak = +ak; var i = 0; var j = 0; var p1 = 0.0; var pt = 0.0; var r = 0.0; // float as double i = i | 0; j = j | 0; ntp = ntp | 0; if ((tp1 | 0) == 0) { tp1 = 1 | 0; tp[0] = +1; for (i = 1; (i | 0) < (ntp | 0); i = (i | 0) + 1 | 0) { tp[(i << 3) >> 2] = +(+2 * tp[((i - 1) << 3) >> 3]); } } if (ak == 1.0) { return +0; } for (i = 0; (i | 0) < (ntp | 0); i = (i | 0) + 1 | 0) { if (+tp[i << 3 >> 3] > p) { break; } } pt = +tp[(i - 1) << 3 >> 3]; p1 = +p; r = +1; for (j = 0; (j | 0) <= (i | 0); j = (j | 0) + 1 | 0) { if (p1 >= pt) { r = +16 * r; r = r - (+(floor(r / ak))) * ak; p1 = p1 - pt; } pt = 0.5 * pt; if (pt >= 1.) { r = r * r; r = r - (+(floor(r / ak))) * ak; } } return +r; } function series(m, id) { m = m | 0; id = id | 0; var k = 0; var ak = 0.0; var eps = 0.0; var p = 0.0; var s = 0.0; var t = 0.0; eps = 0.00000000000000001; k = 0 | 0; for (k; (k | 0) < (id | 0); k = (k | 0) + 1 | 0) { ak = +8 * (+(k | 0)) + (+(m | 0)); p = (+(id | 0) - +(k | 0)); t = +expm(p, ak); s = s + t / ak; s = s - floor(s); } for (k = (id | 0); (k | 0) <= ((id + 100) | 0); k = (k | 0) + 1 | 0) { ak = +8 * (+(k | 0)) + (+(m | 0)); t = pow(+16, +(id | 0) - (+(k | 0))) / +ak; if (t < eps) break; s = s + t; s = s - floor(s); } return +s; } return series; })( { Uint8Array: Uint8Array, Int8Array: Int8Array, Uint16Array: Uint16Array, Int16Array: Int16Array, Uint32Array: Uint32Array, Int32Array: Int32Array, Float32Array:Float32Array, Float64Array:Float64Array, Math: Math }, { NTP:NTP }, buffer ); ihex = function (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]; } }; window.pi = function (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 }; }; })(window);
Source: https://habr.com/ru/post/193642/
All Articles