user-0 提问: 入门的一道OJ题卡勒

回复:
user: user-0
content: 表示都用了一次 提交还是AC 不了 打算先结帖 吧 多谢各位的指点,等我跟老师要了标程再发上来

user: user-1
content: 用fabs

user: user-0
content: 引用 17 楼 logiciel 的回复:我加了abs后在vs2010中运行的结果如下： 9.21 5 0.21313 -9.21 5 -0.21313  #include<stdio.h> #include<math.h> #define pow(x,y) pow((double)x, (double)y) /*加*/ double fun(int c); int main(){   double sum,x;int n;//改 double sum;int n,x;   while(scanf("%lf %d",&x,&n)!=EOF){ //改 while(scanf("%d %d",&x,&n)!=EOF){     int i=1,q=0;sum=0;     while(i){       if(abs(pow(x,i)/fun(i))>=pow(10,-n)){//改 if(pow(x,i)/fun(i)>=pow(10,-n)){         sum=sum+pow(-1,q)*pow(x,i)/fun(i);         i=i+2;         q=q+1;       }       else         break;     }     sum=sum+pow(-1,q)*pow(x,i)/fun(i);     printf("%.*lf\n",n,sum);   }   return 0; }  double fun(int c){   double m=1;   for(int j=1;j<=c;j++){     m=m*j;   }   return(m); }  我用了ACM考试用的编译器CodeBlocks13.12输入 他显示了错误 |error: 'abs' was not declared in this scope| 这是什么情况

user: user-2
content: void main(){ 	double angle; 	int precision; 	printf("请输入弧度和精度:"); 	scanf("%lf %d",&angle,&precision);  	double delta = pow(10.0,-precision); 	double ai = angle; 	double x2 = angle * angle; 	double result = ai; 	 	for(int i=3;;i+=2){ 		ai = ai*x2/i/(1-i);  		if(ai < 0){ 			if(-ai < delta) break; 		}else{ 			if(ai < delta) break; 		} 		result += ai; 	}  	printf("sin(%lf)=%lf",angle,result); 	 }

user: user-3
content: 我加了abs后在vs2010中运行的结果如下： 9.21 5 0.21313 -9.21 5 -0.21313  #include<stdio.h> #include<math.h> #define pow(x,y) pow((double)x, (double)y) /*加*/ double fun(int c); int main(){   double sum,x;int n;//改 double sum;int n,x;   while(scanf("%lf %d",&x,&n)!=EOF){ //改 while(scanf("%d %d",&x,&n)!=EOF){     int i=1,q=0;sum=0;     while(i){       if(abs(pow(x,i)/fun(i))>=pow(10,-n)){//改 if(pow(x,i)/fun(i)>=pow(10,-n)){         sum=sum+pow(-1,q)*pow(x,i)/fun(i);         i=i+2;         q=q+1;       }       else         break;     }     sum=sum+pow(-1,q)*pow(x,i)/fun(i);     printf("%.*lf\n",n,sum);   }   return 0; }  double fun(int c){   double m=1;   for(int j=1;j<=c;j++){     m=m*j;   }   return(m); }

user: user-4
content: 这种 幂级数，不要求阶乘， 1效率低，2精度差 直接用除法乘法递推，就可以了，起码精度还可以的

user: user-0
content: 引用 11 楼 logiciel 的回复:还要改2行：   double sum,x;int n;//改 double sum;int n,x;   while(scanf("%lf %d",&x,&n)!=EOF){ //改 while(scanf("%d %d",&x,&n)!=EOF){  俄 那个X是可以取小数的比如9.21  所以用INT的话是肯定不行的

user: user-0
content: 引用 15 楼 logiciel 的回复:#12的含义是把 if(pow(x,i)/fun(i)>=pow(10,-n)){ 改为 if(abs(pow(x,i)/fun(i))>=pow(10,-n)){ 加个ABS 以后然后运行 输入9.21 5                                          输出了 0.13975    但是答案是0.21313 好奇怪啊

user: user-3
content: 再改一行： if(abs(pow(x,i)/fun(i))>=pow(10,-n)){//改 if(pow(x,i)/fun(i)>=pow(10,-n)){  这样当x为负数时结果就对了。

user: user-3
content: 还要改2行：   double sum,x;int n;//改 double sum;int n,x;   while(scanf("%lf %d",&x,&n)!=EOF){ //改 while(scanf("%d %d",&x,&n)!=EOF){

user: user-3
content: #12的含义是把 if(pow(x,i)/fun(i)>=pow(10,-n)){ 改为 if(abs(pow(x,i)/fun(i))>=pow(10,-n)){

user: user-3
content: 引用 13 楼 H_Joden 的回复:[quote=引用 11 楼 logiciel 的回复:] 还要改2行：   double sum,x;int n;//改 double sum;int n,x;   while(scanf("%lf %d",&x,&n)!=EOF){ //改 while(scanf("%d %d",&x,&n)!=EOF){  俄 那个X是可以取小数的比如9.21  所以用INT的话是肯定不行的 [/quote]我是建议你把x改为double。注意“//改"左边是更改后的语句。

user: user-0
content: 引用 9 楼 user-6 的回复:[quote=引用 8 楼 H_Joden 的回复:] [quote=引用 7 楼 paschen 的回复:] [quote=引用 4 楼 H_Joden 的回复:]   帮你调试半天，终于找到了原因：  求阶乘时数字太大，溢出了int能表示的最大值，用double表示就可以正常了   double fun(int c){ 	double m=1; 	for(int j=1;j<=c;j++){ 		m=m*j; 	} 	return(m); } [/quote]  大哥万分感谢 终于不抱错了 但是提交之后系统给了我wa 感觉是不是精度问题 我又看了半个小时没看出来 求各为邦我看看 http://paste.ubuntu.com/13388997/[/quote] scanf应该是第1个应该%lf, 并且x是double型[/quote] 改了还是报错 感觉不出有问题啊

user: user-5
content: 引用 4 楼 H_Joden 的回复:  帮你调试半天，终于找到了原因：  求阶乘时数字太大，溢出了int能表示的最大值，用double表示就可以正常了   double fun(int c){ 	double m=1; 	for(int j=1;j<=c;j++){ 		m=m*j; 	} 	return(m); }

user: user-6
content: 引用 8 楼 H_Joden 的回复:[quote=引用 7 楼 paschen 的回复:] [quote=引用 4 楼 H_Joden 的回复:]   帮你调试半天，终于找到了原因：  求阶乘时数字太大，溢出了int能表示的最大值，用double表示就可以正常了   double fun(int c){ 	double m=1; 	for(int j=1;j<=c;j++){ 		m=m*j; 	} 	return(m); } [/quote]  大哥万分感谢 终于不抱错了 但是提交之后系统给了我wa 感觉是不是精度问题 我又看了半个小时没看出来 求各为邦我看看 http://paste.ubuntu.com/13388997/[/quote] scanf应该是第1个应该%lf, 并且x是double型

user: user-0
content: 引用 7 楼 paschen 的回复:[quote=引用 4 楼 H_Joden 的回复:]   帮你调试半天，终于找到了原因：  求阶乘时数字太大，溢出了int能表示的最大值，用double表示就可以正常了   double fun(int c){ 	double m=1; 	for(int j=1;j<=c;j++){ 		m=m*j; 	} 	return(m); } [/quote]  大哥万分感谢 终于不抱错了 但是提交之后系统给了我wa 感觉是不是精度问题 我又看了半个小时没看出来 求各为邦我看看 http://paste.ubuntu.com/13388997/

user: user-0
content: 不知道为什么我用VC++6.0可以   那个我是代码貌似是写错了 就是运行以后得到的结果和答案不同  而且是个负数   各位帮我瞧瞧是不是我犯了(水)低级错误

user: user-6
content: 引用 3 楼 H_Joden 的回复:那个跟q=q++每关系的 这是C 可以这样用 你这么自信，你没试过吗，我帮你试了一下http://ideone.com/0zqc9M 这是未定义行为，有些编译器结果是你预想的，有些不是。

user: user-0

user: user-0
content: 那个跟q=q++每关系的 这是C 可以这样用