user-0 提问: 大一初学C语言，有道关于fabs的题想不明白

回复:
user: user-1
content: 引用 9 楼 m0_44977681的回复:直接在while里把i改为i－1也不严谨，因为i初始值为1，i－1做分母不严谨，所以要么第一步那个操作自己先做了，要么就考虑用答案那种方法  	double sum = 1, i = 2, sign = -1;	   	while (1 / (i - 1) >= 1e-4)   	{   		sum = sum + sign / i;   		i++; 	  	sign = -sign;   	}

user: user-1
content: 直接在while里把i改为i－1也不严谨，因为i初始值为1，i－1做分母不严谨，所以要么第一步那个操作自己先做了，要么就考虑用答案那种方法

user: user-1
content: 引用 2 楼 ?AraVio的回复:[quote=引用 1 楼 m0_44977681的回复:]题意理解有问题 题目意思是最后一项的绝对值小于1e-4（参与运算，是最后一项） 你没有把最后的这项加上 i分之一就是最后一项，不考虑i的初始值为1，i＋＋，i始终为正数[/quote] i分之一是最后一项的绝对值  但是原题意思是最后一项的绝对值小于1e－4 你的里面每一项的绝对值都是大于1e－4的，没有把最后一个绝对值小于1e－4这一项加进去 仔细看题”直到最后一项的绝对值小于1e－4（为止）”，明白不 你把你的while里面的i改为i－1就行  答案是创建了一个tn在i＋＋之前赋值，也就是说这个循环结束之后再去判断的时候都tn是本次循环使用的项的绝对值，如果本次使用的项满足条件，则再做一次循环，相对于你的多运行了一次（即当项的绝对值小于1e－4的这次运算），你传入的是i＋＋之后的1/i也就是下次循环将要使用的项的绝对值，少加了一次  就是你少加了一项，就是绝对值小于1e－4的那一项 ，你的项都是绝对值大于1e－4的，明白了吧

user: user-0
content: 引用 8 楼 m0_44977681的回复:[quote=引用 2 楼 ?AraVio的回复:][quote=引用 1 楼 m0_44977681的回复:]题意理解有问题 题目意思是最后一项的绝对值小于1e-4（参与运算，是最后一项） 你没有把最后的这项加上 i分之一就是最后一项，不考虑i的初始值为1，i＋＋，i始终为正数[/quote] i分之一是最后一项的绝对值  但是原题意思是最后一项的绝对值小于1e－4 你的里面每一项的绝对值都是大于1e－4的，没有把最后一个绝对值小于1e－4这一项加进去 仔细看题”直到最后一项的绝对值小于1e－4（为止）”，明白不 你把你的while里面的i改为i－1就行  答案是创建了一个tn在i＋＋之前赋值，也就是说这个循环结束之后再去判断的时候都tn是本次循环使用的项的绝对值，如果本次使用的项满足条件，则再做一次循环，相对于你的多运行了一次（即当项的绝对值小于1e－4的这次运算），你传入的是i＋＋之后的1/i也就是下次循环将要使用的项的绝对值，少加了一次  就是你少加了一项，就是绝对值小于1e－4的那一项 ，你的项都是绝对值大于1e－4的，明白了吧[/quote] 意思和7楼说的有些像，但是是正确答案多加了一项

user: user-0
content: 引用 8 楼 m0_44977681的回复:[quote=引用 2 楼 ?AraVio的回复:][quote=引用 1 楼 m0_44977681的回复:]题意理解有问题 题目意思是最后一项的绝对值小于1e-4（参与运算，是最后一项） 你没有把最后的这项加上 i分之一就是最后一项，不考虑i的初始值为1，i＋＋，i始终为正数[/quote] i分之一是最后一项的绝对值  但是原题意思是最后一项的绝对值小于1e－4 你的里面每一项的绝对值都是大于1e－4的，没有把最后一个绝对值小于1e－4这一项加进去 仔细看题”直到最后一项的绝对值小于1e－4（为止）”，明白不 你把你的while里面的i改为i－1就行  答案是创建了一个tn在i＋＋之前赋值，也就是说这个循环结束之后再去判断的时候都tn是本次循环使用的项的绝对值，如果本次使用的项满足条件，则再做一次循环，相对于你的多运行了一次（即当项的绝对值小于1e－4的这次运算），你传入的是i＋＋之后的1/i也就是下次循环将要使用的项的绝对值，少加了一次  就是你少加了一项，就是绝对值小于1e－4的那一项 ，你的项都是绝对值大于1e－4的，明白了吧[/quote] 我感觉7楼说的是对的

user: user-2
content: 你对，答案错  分析如下#include "math.h" void main() { 	double s=0,tn=1,i=1; 	double sign=1;  	while (fabs(tn)>=1e-4)//步骤4  此时tn 还没更新，还是0.0001 	{ 		tn=sign/i; /*步骤5 这时候i等于10001, 终于tn过界限，但是流程还是继续，于是多加了一个1.0/10001*/	 		/*步骤1.假设i已经等于10000， 这时候是分界点了 		此时tn刚好等于1e-4(0.0001), 往下走*/	 		s=s+tn;	/*步骤2： 0.0001已经加过，照说不能再进入循环了，可是。。。。*/  		i++;	/*步骤3：i已经等于10001.0*/ 		sign=-sign; 	}  	printf("s=%f\n",s);  } /* 虽然问题我们已经分析清楚，但是你初一看，这个循环是没毛病啊  其实是有问题的，问题在于循环控制条件tn tn在循环体中的值，已经与while(tn??)循环控制里时的值不一致了：通过(tn = sign/i)变更的 但是他还在继续参与运算，并改变其他变量的值，巴拉巴拉~~~~~~此处略去500字，因此违反了设计初衷  再谈浮点数的精度 你把答案的打印函数，和你自己的打印函数改一下 改成printf("s=%.20f\n", s);， 你会发现什么？两者的值不是差那个0.0001 而是差1.0/10001  再留个问题给你思考看 double f1 = 0.1 float f2 = 0.1 if(f1 == f2)????  */

user: user-0
content: 引用 5 楼 focuslight的回复:要不你把int改为double再试试 还是0.693097

user: user-3
content: 要不你把int改为double再试试

user: user-0
content: 最后一项是符号项乘i分之一，i的初始值为1，i＋＋，i始终为正数，最后一项的绝对值不就是i分之一吗

user: user-0
content: 引用 1 楼 m0_44977681的回复:题意理解有问题 题目意思是最后一项的绝对值小于1e-4（参与运算，是最后一项） 你没有把最后的这项加上 i分之一就是最后一项，i的初始值为1，i＋＋，i始终为正数，最后一项的绝对值不就是i分之一吗

user: user-0
content: 引用 1 楼 m0_44977681的回复:题意理解有问题 题目意思是最后一项的绝对值小于1e-4（参与运算，是最后一项） 你没有把最后的这项加上 i分之一就是最后一项，不考虑i的初始值为1，i＋＋，i始终为正数

user: user-1
content: 题意理解有问题 题目意思是最后一项的绝对值小于1e-4（参与运算，是最后一项） 你没有把最后的这项加上