与えられた精度 (0.0001 など) で (1-x)^0.25 を近似する必要があります。ウィキペディアにある (1+x)^0.25 の展開を使用しています。現在の式が精度よりも低い場合、近似を停止する必要があります。
long double s(long double x, long double d) {
long double w = 1;
long double n = 1; // nth expression in series
long double tmp = 1;
// sum while last expression is greater than accuracy
while (fabsl(tmp) >= d) {
tmp *= (1.25 / n - 1) * (-x); // the next expression
w += tmp; // is added to approximation
n++;
}
return w;
}
long double n は気にしないでください。:P これは、現在の式の値をチェックしているのではなく、1000 以上の式を計算しているときにうまく機能します。関数の定義域は <-1;1> で、s() は <-1;~0.6> で x の近似をうまく計算します。引数が大きいほど計算誤差が大きくなります。0.6からは精度を超えています。
私は英語の数学言語をよく知らないので、問題が十分に明確かどうかわかりません. 問題は、 while 条件の問題と、関数 s() が正しく近似されない理由です。
編集: 問題はほとんど解決しました。x>0 の場合、連続する式の絶対値を 1 から引く必要があります。
if (x<0)
w += tmp;
else
w -= fabsl(tmp);
その後、精度は大幅に向上します (もちろん fox x>0)。重複エラーは、長い double 不正確性に起因します。それで全部です。とにかくあなたたちに感謝します。