forked from stdlib-js/stdlib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdceval.js
88 lines (78 loc) · 2.55 KB
/
dceval.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/**
* @license Apache-2.0
*
* Copyright (c) 2018 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*
* ## Notice
*
* The code is adapted from the Fortran routine from the FNLIB library of the [SLATEC Common Mathematical Library]{@link https://netlib.org/slatec/fnlib/dcsevl.f}.
*
* The original code was developed by W. Fullerton of Los Alamos Scientific Laboratory, a governmental institution, and is therefore public domain.
*/
'use strict';
// VARIABLES //
var ALGMCS = [
+0.1276642195630062933333333333333e-30,
-0.3401102254316748799999999999999e-29,
+0.1025680058010470912000000000000e-27,
-0.3547598158101070547199999999999e-26,
+0.1429227355942498147573333333333e-24,
-0.6831888753985766870111999999999e-23,
+0.3962837061046434803679306666666e-21,
-0.2868042435334643284144622399999e-19,
+0.2683181998482698748957538846666e-17,
-0.3399615005417721944303330599666e-15,
+0.6221098041892605227126015543416e-13,
-0.1809129475572494194263306266719e-10,
+0.9810825646924729426157171547487e-8,
-0.1384948176067563840732986059135e-4,
+0.1666389480451863247205729650822e+0
];
var LEN = ALGMCS.length;
// MAIN //
/**
* Evaluates the n-term Chebyshev series at `x`.
*
* ## References
*
* - Broucke, Roger. 1973. "Algorithm: Ten Subroutines for the Manipulation of Chebyshev Series." _Communications of the ACM_ 16 (4). New York, NY, USA: ACM: 254–56. doi:[10.1145/362003.362037](https://doi.org/10.1145/362003.362037).
* - Fox, Leslie, and Ian Bax Parker. 1968. _Chebyshev polynomials in numerical analysis_. Oxford Mathematical Handbooks. London, United Kingdom: Oxford University Press. <https://books.google.com/books?id=F8NzsEtJCD0C>.
*
* @private
* @param {number} x - value at which the series is to be evaluated
* @returns {number} series value
*/
function dcseval( x ) {
var twox;
var b2;
var b1;
var b0;
var i;
if ( x < -1.1 || x > 1.1 ) {
return NaN;
}
b1 = 0.0;
b0 = 0.0;
twox = 2.0 * x;
for ( i = 0; i < LEN; i++ ) {
b2 = b1;
b1 = b0;
b0 = (twox*b1) - b2 + ALGMCS[ i ];
}
return ( b0-b2 ) * 0.5;
}
// EXPORTS //
module.exports = dcseval;