私が書いた関数に問題があります。この考えは、js
算術オブジェクトの代わりにtaylor
拡張を使用して、sinとcosin
値(radians
で動作)を計算することでした。Javascript sin/cosin taylor expansion
sin(x) = (x^1)/1! - (x^3)/3! + (x^5)/5! - (x^7)/7! + (x^9)/9! - (x^11)/11! + ...
cos(x) = (x^0)/0! - (x^2)/2! + (x^4)/4! - (x^6)/6! + (x^8)/8! - (x^10)/10! + ...
私はしかし、私は理解していけない、私はmyCos(10,2)
のようなものを入力すると、結果が原因で繰り返しの低量の不正確なことを行っていることを理解し、なぜのための(例えば):これらは式でありますx = 10
の結果は具体的にはiterNum = 6
で実際に始まり、はiterNum = 80
になります。ポイントは、myCos/Sin(1-40, 5-50)
(多かれ少なかれ)関数のような範囲では機能しますが、数値が大きいほど結果はNaNになります。 「あなたの問題
function power(a,n) {
var result = 1;
for (var i = 0; i < n; i++) {
result = result * a;
}
return result;
}
function factorial(z) {
var result = 1;
for (var i = 1; i <= z; i++) {
result = result * i;
}
return result;
}
function mySin(x, iterNum) {
var sin = 0;
var n = 1;
for (var i = 0; i <= iterNum; i++) {
sin = sin + (power(x,n)/factorial(n) - power(x,n+2)/factorial(n+2));
n = n + 4;
}
console.log(sin + " = my function.");
console.log(Math.sin(x) + " math.sin");
}
function myCos(x, iterNum) {
var cos = 0;
var n = 0;
for (var i = 0; i <= iterNum; i++) {
cos = cos + (power(x,n)/factorial(n) - power(x,n+2)/factorial(n+2));
n = n + 4;
}
console.log(cos + " = my function.");
console.log(Math.cos(x) + " math.cos");
}
NaNを回避する階乗的で無力な実装については、http://stackoverflow.com/a/22791396/3088138、http://stackoverflow.com/a/28227419/3088138を参照してください。しかし、非常に致命的なキャンセルはしません。より大きな「x」に対しては大きな項。 – LutzL