|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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 enterFunc ('test'); |
|
20 printBugNumber(BUGNUMBER); |
|
21 printStatus (summary); |
|
22 |
|
23 |
|
24 // Print x as a continued fraction in compact abbreviated notation and return |
|
25 // the convergent [n, d] such that x - (n / d) <= epsilon. |
|
26 function contfrac(x, epsilon) { |
|
27 let i = Math.floor(x); |
|
28 let a = [i]; |
|
29 x = x - i; |
|
30 let maxerr = x; |
|
31 while (maxerr > epsilon) { |
|
32 x = 1 / x; |
|
33 i = Math.floor(x); |
|
34 a.push(i); |
|
35 x = x - i; |
|
36 maxerr = x * maxerr / i; |
|
37 } |
|
38 print(uneval(a)); |
|
39 return a.reduceRight(function (x, y) {return [x[0] * y + x[1], x[0]];}, [1, 0]); |
|
40 } |
|
41 |
|
42 if (!Array.prototype.reduceRight) |
|
43 { |
|
44 print('Test skipped. Array.prototype.reduceRight not implemented'); |
|
45 } |
|
46 else |
|
47 { |
|
48 // Show contfrac in action on some interesting numbers. |
|
49 for each (num in [Math.PI, Math.sqrt(2), 1 / (Math.sqrt(Math.E) - 1)]) { |
|
50 print('Continued fractions for', num); |
|
51 for each (eps in [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(uneval(frac), est, err); |
|
56 } |
|
57 print(); |
|
58 } |
|
59 } |
|
60 |
|
61 reportCompare(expect, actual, summary); |
|
62 |
|
63 exitFunc ('test'); |
|
64 } |