用C++进行级数计算,帮忙看一下问题出在哪

skynn99 2008-04-14 09:21:23
问题:对运行中输入的x,计算级数1+x -x2 /2!+x3/3!-……(-1)n+1xn/n!要求输出精度为10-8。我写了以下的代码,但实现不了,不知道问题出在哪,高手们帮忙看一下。
--------------------------------------------------------------------------------


#include<iostream>
#include<cmath>
using namespace std;
int jc(int m){ //求阶乘
int sum=1;
if(m>=1)
{
for(int k=1;k<=m;k++)
sum*=m;
return sum;
}else return 1;
}

float ts(int n,float x) //求通项
{ float t=pow(-1,n+1)*pow(x,n)/jc(n);
return t;
}

void main()
{int n;
float x,y;
cin>>x;

for(n;ts(n,x)<pow(10,-8);n++)
y+=ts(n,x);
cout<<y<<"\n";
}

...全文
759 15 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
fallening 2008-04-15
  • 打赏
  • 举报
回复
似乎没有考虑舍入误差的
mathe 2008-04-15
  • 打赏
  • 举报
回复
只有一次++同编译器没有关系,可以放心使用。当然你分开写也没有关系。(注意两种情况n的初试值不同,或者将n++移到后面)
WuBill 2008-04-15
  • 打赏
  • 举报
回复

item =x; //在循环外先取得x
while(fabs(item)>eps){
sum+=item;
item*=-x;
n++; // 个人觉得把n++单写一行比较好,
item/=n; // item/=n++;的值好象和具体编译器有关
}
mathe 2008-04-15
  • 打赏
  • 举报
回复
此外如果追求性能,其实把n声明成double应该比把n声明成int更加好一些,可以避免不必要的数据类型转化(从整型转化为浮点型)
mathe 2008-04-15
  • 打赏
  • 举报
回复
呵呵,是错了,我以为是exp(-x)呢
WuBill 2008-04-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mathe 的回复:]
没必要保存n!的

C/C++ code
double item=1.0;
double sum=0.0;
int n=1;
while(fabs(item)>eps){
sum+=item;
item*=-x;
item/=n++;
}
return sum;
[/Quote]

确实精练,好象这样精度也高些
不过好象和LZ说的通项错了一位
1+x -x2 /2!+x3/3!-……(-1)n+1xn/n!

1-x +x2/2! -x3/3!+.....
WuBill 2008-04-15
  • 打赏
  • 举报
回复
#include <iostream>
#include <cmath>
using namespace std;

void main()
{
double x;
double sum,series;
double numerator,denominator;
const double eps = 1e-8;
int flag = 1, n=1;
cin >> x;
numerator = x;
denominator = 1.0;
series=0.0;
sum=1.0;
while (fabs(series-sum)>eps)
{
series=sum;

sum += (flag*numerator / denominator);

n++;
denominator *= n;
numerator *= x;
flag=-flag;
}
cout.precision(16);
cout << series <<"\n";
}
mathe 2008-04-15
  • 打赏
  • 举报
回复
呀,漏掉了一个++
后面的
item/=n改为item/=n++;
mathe 2008-04-15
  • 打赏
  • 举报
回复
没必要保存n!的

double item=1.0;
double sum=0.0;
int n=1;
while(fabs(item)>eps){
sum+=item;
item*=-x;
item/=n;
}
return sum;
baihacker 2008-04-15
  • 打赏
  • 举报
回复
 
//这样好一点点,避免可能影响精度的重复计算
//其中y/fac的计算值得重新思考
//是x/1 * x/2 * x/3 ...的精度高还是y/fac的精度高还是去考虑这里的精度根本就没有意义呢
double x , y;
const double eps = 1e-8;
double c = 1, fac = 1, inc;
int s = 1, n = 1;
cin >> x;
y = x;
while (fabs(inc = s * 1.0 * y / fac)>eps)
{
c += inc;
s = -s;
fac *= ++n;
y *= x;
}
baihacker 2008-04-15
  • 打赏
  • 举报
回复
谢谢指出,改了...
    double x , y; 
const double eps = 1e-8;
double l = 0, c = 1, fac = 1;
int s = 1, n = 1;
cin >> x;
y = x;
while (fabs(c-l)>eps)
{
l = c;
c += s * 1.0 * y / fac;
s = -s;
fac *= ++n;
y *= x;
}
cout.precision(16);
cout << c <<"\n";
WuBill 2008-04-15
  • 打赏
  • 举报
回复
精度double也够了
n *= n+1; //这句问题比较大

Maxwell 2008-04-15
  • 打赏
  • 举报
回复
至少应该将存储的类型改为long double,long double至少相当于double,有至少15位精度。
WuBill 2008-04-15
  • 打赏
  • 举报
回复
飞雪的程序好象不对啊,可能是大意了^_^
baihacker 2008-04-14
  • 打赏
  • 举报
回复

#include <iostream>
#include <cmath>
using namespace std;

void main()
{
double x , y;
const double eps = 1e-8;
double l = 0, c = 1;
int s = 1, n = 1;
cin >> x;
y = x;
while (fabs(c-l)>eps)
{
l = c;
c += s * 1.0 * y / n;
s = -s;
n *= n+1;
y *= x;
}
cout.precision(16);
cout << c <<"\n";
}


相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-04-14 09:21
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下