Asm.js рдЕрднреНрдпрд╛рд╕

рдЫрд╡рд┐
рдЗрд╕ рд╢рд╛рдВрдд рджрд┐рди, рдореИрдВ рдкреА рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХреБрдЫ рдЕрд╕рдВрдЦреНрдп рдереЗ, рд▓реЗрдХрд┐рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдФрд░ рд╕реА рдореЗрдВ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдкреЛрд╕реНрдЯ рдерд╛ред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕рдХреА рдЧрддрд┐ рдХреЗ рд╕рд╛рде рд▓реБрднрд╛рд╡рдирд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рд╣реЗрдХреНрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реБрдЖ рдХрд┐ рдореБрдЭреЗ js рдкрд░ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рддрд╛рддреНрдХрд╛рд▓рд┐рдХ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдирд┐рдпрдорд┐рдд js рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдиреЗ рдмрд╣реБрдд рдЦрд░рд╛рдм рдЖрдВрдХрдбрд╝реЗ рджрд┐рдЦрд╛рдП, рдЬрдм 1,000,000 рд╕рдВрдХреЗрдд рдЧрд┐рдирдиреЗ рдореЗрдВ рдХрд╛рдо рд▓рд┐рдпрд╛ ... 48 рд╕реЗрдХрдВрдб (4GHz FF)ред
рдПрд╕реНрдорд╛рдЬ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЦрд┐рд▓рд╡рд╛рдбрд╝ рд╣реБрдЖ рдФрд░ рд╡рд╣ рдХрд┐рди рдкрддреНрдерд░реЛрдВ рд╕реЗ рдорд┐рд▓рд╛, рдЗрд╕рдХрд╛ рдкрддрд╛ рдХрдЯ рдХреЗ рдиреАрдЪреЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЕрдзреАрд░ рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдо рдЬреАрдердм рд╣реИ ред

рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рд╣рдореЗрдВ рд╕рднреА рдкреАрдврд╝реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдПрдПрд╕рдПрдо рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдПрдХреНрд╕рдкрдо рдФрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ред рдХреНрдпреЛрдВрдХрд┐ expm рдХреЛ рдЕрдВрджрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рд╣рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдХреЗрд╡рд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореВрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ
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 

"TypeError: asm.js рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐: asm.js рдореЙрдбреНрдпреВрд▓ рдХреА рд╡рд╛рдкрд╕реА рдПрдХреНрд╕рдкреЛрд░реНрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП" рдХреНрд░реИрд╢ рдХреА рдПрдХ рддреНрд░реБрдЯрд┐ , рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреБрдЫ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рд▓реМрдЯрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЪрд░ рдХреА рдШреЛрд╖рдгрд╛рдПрдВ рд╕рд╣реА рд╣реИрдВред рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд╛рдж, рдореБрдЭрд╕реЗ рдПрдХ рдЧрд▓рддреА рд╣реБрдИ, рдореИрдВрдиреЗ рдПрдХ рдЕрдВрддрд░ рдЪрд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗ рд╣реА рдкрддрд╛ рдЪрд▓ рдЪреБрдХреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА:
  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 } 


рдиреБрдХрд╕рд╛рди рдирдВрдмрд░ 1: рдЪрд░ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХрд╛рд░реНрдп


рдореИрдВ рдкрд╣рд▓реЗ рд╕рднреА рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рдерд╛, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЙрдиреНрд╣реЗрдВ рдореВрд▓реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рдерд╛ред Asm.js рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХреБрдЫ рдкреЗрдЪреАрджрд╛ рд╣реИ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрди рд╕рднреА рдЪрд░реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдХреНрд▓реЛрдЬрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЧрдгрд┐рддреАрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рднреА рдпрд╣рд╛рдБ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдиреАрдЪреЗ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ:
  "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) { //  } 


рдЦрд░рд╛рдмреА # 2: рдореЙрдбреНрдпреВрд▓ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЪрд░ред


рд▓реЗрдХрд┐рди рдореЙрдбреНрдпреВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрдирдкреБрдЯ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдлрд┐рд░ рдЖрдВрддрд░рд┐рдХ рдЪрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрджрд┐ рдпрд╣ int рд╣реИ, рддреЛ var i = 0, рдпрджрд┐ рдбрдмрд▓ рд╣реИ, рддреЛ var d = 0.0, рдпрджрд┐ рд╕рд░рдгреА рд╣реИ, рддреЛ рдирдП рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╣реАрдк рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛, рдФрд░ ints рдЖрд░рдВрднреАрдХреГрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЙрдиреНрд╣реЗрдВ "рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝" рдХрд░реВрдВ, рдореБрдЭреЗ рдлреЙрд░реНрдо i = i | 0 рдЕрд╕рд╛рдЗрди рдХрд░рдХреЗред рд╡реИрд╕реЗ: рд╕реА рдХреА рд╢реИрд▓реА рдореЗрдВ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЪрд░ рдХрд╛ рдЖрд░рдВрдн рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдлреЙрд░реНрдо 1e-17 рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рдХреА рддреНрд░реБрдЯрд┐ рджреЗрддреА рд╣реИ, 0.00000000000000001 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдЖрдЙрдЯрдкреБрдЯ:
  function expm(p, ak) { p = +p; ak = +ak; var i = 0; var pt = 0.0; // .... i = i | 0; ntp = ntp | 0; //  } 


рдиреБрдХрд╕рд╛рди # 3: рддреБрд▓рдирд╛ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ


рд╕рдЪ рдХрд╣реВрдВ, рдпрд╣рд╛рдВ рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╣рдВрд╕рддрд╛ рд░рд╣рд╛, рд▓реЗрдХрд┐рди рдЗрдВрдЯ рдФрд░ рдЗрдВрдЯ рдХреА рддреБрд▓рдирд╛ рдХреЗ рдЕрдзреАрди рдирд╣реАрдВ рд╣реИрдВ ред рдпрджрд┐ рдЖрдк i == k рдпрд╛ i <l рдЬреИрд╕реЗ рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЬреИрд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди
"TypeError: asm.js рдЯрд╛рдЗрдк рддреНрд░реБрдЯрд┐: рдПрдХ рддреБрд▓рдирд╛ рдХреЗ рддрд░реНрдХ рджреЛрдиреЛрдВ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП, рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдпрд╛ рдпреБрдЧрд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЗрдВрдЯ рдФрд░ рдЗрдВрдЯ рджрд┐рдП рдЧрдП рд╣реИрдВ ред "
Int рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ (i == 0) рдХреА рддреБрд▓рдирд╛ рдХрд░рдХреЗ рдереЛрдбрд╝реА рд╣рдВрд╕реА рдЬреЛрдбрд╝реА рдЧрдИ
"TypeError: asm.js рдЯрд╛рдЗрдк рддреНрд░реБрдЯрд┐: рдПрдХ рддреБрд▓рдирд╛ рдХреЗ рддрд░реНрдХ рджреЛрдиреЛрдВ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП, рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдпрд╛ рдпреБрдЧрд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдлрд┐рдХреНрд╕реЗрдирдо рдФрд░ рдЗрдВрдЯ рджрд┐рдП рдЧрдП рд╣реИрдВ ред "
рдХреЗрд╡рд▓ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛рдПрдБ рдареАрдХ рдХрд░ рд░рд╣реА рд╣реИрдВ (рдЙрджрд╛ред Pt == 1.0)ред
рдирддреАрдЬрддрди, рдЕрдЧрд░ рдЖрдк рдЕрднреА рднреА рдПрдХ рдФрд░ рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкреНрд░рдкрддреНрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (iред 0) <(ntp | 0) |
рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рд╕рд┐рд░реНрдл "рдЖрдХрд░реНрд╖рдХ" рд╣реИ: рд╣рдо рд╕рднреА рдХреЗ рдмрдЬрд╛рдп i ++ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ i = (i | 0) + 1 | 0ред
рдкрд░рд┐рдгрд╛рдо:
  if ((tp1 | 0) == 0) { // vars for (i = 1; (i | 0) < (ntp | 0); i = (i | 0) + 1 | 0) { // surprise, read more) } } 


рдиреБрдХрд╕рд╛рди рдирдВрдмрд░ 4: рдЧрдгрд┐рддреАрдп рдФрд░ рдЕрдиреНрдп рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдпред


рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдпрджрд┐ рдЖрдк рдлрд░реНрд╢, рдкрд╛рдк, рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рддреБрд░рдВрдд "рдПрд╕рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ")ред рдпрджрд┐ рдореИрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ stdlib.Math.floor рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд╕реНрддреБ рдХреЗ рдЧреБрдгреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рдХрд╛рд░рдгред

рдЦрд╝рддрд░рд╛ # 5: рдмрдлрд╝рд░реНрд╕ред


рдФрд░ рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдЬрдм рд╣рдо рдЗрдВрдбреЗрдХреНрд╕ i рдХреЗ рд╕рд╛рде / рдЕрд░реЗ рдПрд░реЗ рдХреЛ рдорд╛рди рджреЗрдирд╛ / рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ? рдЧрд┐рд░рдлреНрддрд╛рд░реА [i]ред рдорд╛рдирд╛ рдХрд┐ рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рддрдм рд╣рдореЗрдВ рдлреЙрд░реНрдо рдХреА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред
  arr[i] = +1; 

"TypeError: asm.js рдЯрд╛рдЗрдк рддреНрд░реБрдЯрд┐: рдЗрдВрдбреЗрдХреНрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдПрдХ Int8 / Uint8 рдкрд╣реБрдВрдЪ ┬╗рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
рд╣рдо рд╕реВрдХреНрд╖реНрдо рд░реВрдк рд╕реЗ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдмрджрд▓рд╛рд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдЧреБрд░реБ рдореЗрдВ, рдореБрдЭреЗ рджрд╛рдИрдВ рдУрд░ 2 рдХреА рд╢рд┐рдлреНрдЯ рдорд┐рд▓реАред
  arr[i >> 2] = +1; 

"TypeError: asm.js рдЯрд╛рдЗрдк рддреНрд░реБрдЯрд┐: рд╢рд┐рдлреНрдЯ рд░рд╛рд╢рд┐ 3 рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП"
рд╣рдо рд╡рд┐рдирдореНрд░рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рддреАрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  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); 


PS рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреМрди рдпрд╛ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ, рд▓реЗрдХрд┐рди (!) рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдиреЗ asm.s рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрджрддрд░ рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд┐рдПред
рдЕрд░реНрдерд╛рддреН,
рд╕рдордп ./pi 1,000,000
>> рд╡рд╛рд╕реНрддрд╡рд┐рдХ 0m2.161s
>> рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 0m2.149s
>> sys 0m0.001s

рдХрдВрд╕реЛрд▓.рдЯрд╛рдЗрдо ('рдПрд╕');
рдкреАрдЖрдИ (1,000,000);
рдХрдВрд╕реЛрд▓.рдЯрд╛рдЗрдо рдИрдВрдб ('рдПрд╕');
>> s: 1868.5ms

рдФрд░ рдпрд╣ рднреА:
рд╕рдордп ./pi 10000000
>> рд╡рд╛рд╕реНрддрд╡рд┐рдХ 0m25.345s
>> рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 0m25.176s
>> sys 0m0.019s

рдХрдВрд╕реЛрд▓.рдЯрд╛рдЗрдо ('рдПрд╕');
рдкреАрдЖрдИ (10,000,000);
рдХрдВрд╕реЛрд▓.рдЯрд╛рдЗрдо рдИрдВрдб ('рдПрд╕');
>> s: 22152.83ms

рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реЛрддрд╛? рдЗрд╕рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рдЙрдкрд░реЛрдХреНрдд рдкреЛрд╕реНрдЯ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдбред рдореЗрд░реЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рднреА рдКрдкрд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпреБрдкреАрдбреА:
рдореИрдВ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП testASM.js рдХреЛ gitub рдкрд░ рд░рдЦрддрд╛ рд╣реВрдБ рдХрд┐ рдХреНрдпрд╛ asmjs рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЪрд░ window.asmjs (рдмреВрд▓) рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред testASM.js рдФрд░ testASM.min.js

Source: https://habr.com/ru/post/In193642/


All Articles