我需要大约 (1-x)^0.25 并具有给定的精度(例如 0.0001)。我正在使用Wikipedia 上的扩展(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;
}
不要介意长双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);
在那之后准确性增加了很多(当然是狐狸x> 0)。冗余误差源于长期的双重误差。就这样。无论如何,谢谢你们。