regress-363040-01.js (1770B)
1 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 //----------------------------------------------------------------------------- 7 var BUGNUMBER = 363040; 8 var summary = 'Array.prototype.reduce application in continued fraction'; 9 var actual = ''; 10 var expect = ''; 11 12 13 //----------------------------------------------------------------------------- 14 test(); 15 //----------------------------------------------------------------------------- 16 17 function test() 18 { 19 printBugNumber(BUGNUMBER); 20 printStatus (summary); 21 22 // Print x as a continued fraction in compact abbreviated notation and return 23 // the convergent [n, d] such that x - (n / d) <= epsilon. 24 function contfrac(x, epsilon) { 25 let i = Math.floor(x); 26 let a = [i]; 27 x = x - i; 28 let maxerr = x; 29 while (maxerr > epsilon) { 30 x = 1 / x; 31 i = Math.floor(x); 32 a.push(i); 33 x = x - i; 34 maxerr = x * maxerr / i; 35 } 36 print(a); 37 a.push([1, 0]); 38 a.reverse(); 39 return a.reduce(function (x, y) {return [x[0] * y + x[1], x[0]];}); 40 } 41 42 if (!Array.prototype.reduce) 43 { 44 print('Test skipped. Array.prototype.reduce not implemented'); 45 } 46 else 47 { 48 // Show contfrac in action. 49 for (num of [Math.PI, Math.sqrt(2), 1 / (Math.sqrt(Math.E) - 1)]) { 50 print('Continued fractions for', num); 51 for (eps of [1e-2, 1e-3, 1e-5, 1e-7, 1e-10]) { 52 let frac = contfrac(num, eps); 53 let est = frac[0] / frac[1]; 54 let err = num - est; 55 print(frac, est, err); 56 } 57 print(); 58 } 59 } 60 61 reportCompare(expect, actual, summary); 62 }