我必须用C编写一个程序,它计算pow(a,x)函数的扩展。我确定我的代码错了,有人可以帮我吗?
扩张:
1 + x log(a) + 1/2 x^2 log^2(a) + 1/6 x^3 log^3(a) + 1/24 x^4 log^4(a) + 1/120 x^5 log^5(a) +...
不使用pow功能。下一个表达式必须从前一个表达式计算。
这是我设法带来的:
double series(double x)
{
int i;
double s,w,x2;
s=x;
w=x;
for(i=1;i<LWS;i++)
{
w=(w*x/(i+1))*log10(x);
s+=w;
}
return s;
}
我已经有了其余的代码。
答案 0 :(得分:0)
log a只需要计算一次。一个不错的编译器会为你做这件事,但为了以防万一,请帮助它。
每个学期现在都是1 / i! * x ^ i * loga ^ i
1 / i!术语增长非常快,意味着在几次迭代中,除非x很大,否则误差可以忽略不计。
如果你愿意,你可以保持运行因子,如果(i factorial)乘以i(确保它是一个double,而不是一个整数),xp(x power)在每个interation上乘以x并且相同的东西发生在loga。
我实际上还记得要扩展一个战俘系列,所以我只是假设你的公式是正确的。它看起来基本正确。我们使用自然日志(数学符号中的ln,登录C)哪种取消与因子项有关,这与e ^ x有关。
答案 1 :(得分:0)
基本上,你正在做的是:a^x = e^(x * ln(a))
然后使用泰勒的e
系列扩展。
您的代码中有一些错误:
e
的扩展,因此您需要使用自然对数(基数e
),而不是以10
为基础的对数。s
的初始值必须设置为1
。这是因为a^x = 1 when x=0
(如果a != 0
)。w
必须设置为1
。这是x * ln(a)
的一组很好的权力。在w=x
之前,x
的力量将超过ln(a)
的力量。i
必须从i=0
开始循环播放。这是为了在进行上述更改后立即获得阶乘。所以代码变成:
double series(double x)
{
int i;
double s,w,x2;
s=1.0;
w=1.0;
for(i=0;i<LWS;i++)
{
w=(w*x/(i+1))*log(x);
s+=w;
}
return s;
}