1-1/2+1/3-1/4+…+1/99-1/100将结果输出,该怎么处理
1-1/2+1/3-1/4+……+1/99-1/100将结果输出
#include<stdio.h>
void main()
{
float sum=1.0,t,s=1;
int i;
for(i=1;i<=100;i++)
{
t=s/i;
sum=sum+t;
s=-s;
}
printf("1-1/2+1/3-1/4+……+1/99-1/100=%5.4f\n",sum);
}
为什么运行结果是1-1/2+1/3-1/4+......+1/99-1/100= inf
------解决方案--------------------
#include<stdio.h>
void main()
{
float sum=1.0,t,s=1;
int i;
for(i=1;i<=100;i++)
{
t=s/i;
sum=sum+t;
s=-s;
}
printf("1-1/2+1/3-1/4+……+1/99-1/100=%5.4f\n",sum);
}
为什么运行结果是1-1/2+1/3-1/4+......+1/99-1/100= inf
------解决方案--------------------
- C/C++ code
// 1-1/2+1/3-1/4+......+1/99-1/100= #include <stdio.h> void main() { double sum=0.0,t,s=1.0; int i; for (i=1;i<=100;i++) { t=s/(double)i; sum=sum+t; s=-s; printf("%d %.15lg\n",i,sum); } printf("1-1/2+1/3-1/4+……+1/99-1/100=%.15lg\n",sum); } //1 1 //2 0.5 //3 0.833333333333333 //4 0.583333333333333 //5 0.783333333333333 //6 0.616666666666667 //7 0.759523809523809 //8 0.634523809523809 //9 0.745634920634921 //10 0.645634920634921 //11 0.736544011544012 //12 0.653210678210678 //13 0.730133755133755 //14 0.658705183705184 //15 0.72537185037185 //16 0.66287185037185 //17 0.721695379783615 //18 0.66613982422806 //19 0.718771403175428 //20 0.668771403175428 //21 0.716390450794476 //22 0.67093590533993 //23 0.714414166209495 //24 0.672747499542829 //25 0.712747499542829 //26 0.67428596108129 //27 0.711322998118327 //28 0.675608712404042 //29 0.710091471024731 //30 0.676758137691398 //31 0.709016202207527 //32 0.677766202207527 //33 0.708069232510557 //34 0.678657467804675 //35 0.707228896376103 //36 0.679451118598326 //37 0.706478145625353 //38 0.680162356151668 //39 0.705803381792694 //40 0.680803381792694 //41 0.705193625695133 //42 0.681384101885609 //43 0.704639915839098 //44 0.681912643111825 //45 0.704134865334047 //46 0.682395734899265 //47 0.703672330643946 //48 0.682838997310612 //49 0.703247160575918 //50 0.683247160575918 //51 0.702855003713173 //52 0.683624234482404 //53 0.702492159010706 //54 0.683973640492187 //55 0.702155458674006 //56 0.684298315816863 //57 0.701842175465985 //58 0.684600796155641 //59 0.701549948698013 //60 0.684883282031347 //61 0.701276724654297 //62 0.685147692396233 //63 0.701020708269249 //64 0.685395708269249 //65 0.700780323653864 //66 0.685628808502349 //67 0.700554181636677 //68 0.685848299283736 //69 0.700341052906925 //70 0.68605533862121 //71 0.700139845663464 //72 0.686250956774575 //73 0.699949586911561 //74 0.686436073398048 //75 0.699769406731381 //76 0.686611511994539 //77 0.699598524981552 //78 0.686778012161039 //79 0.69943624000914 //80 0.68693624000914 //81 0.699281919021486 //82 0.687086797070267 //83 0.699134989841351 //84 0.687230227936589 //85 0.698994933818942 //86 0.687367026842198 //87 0.698861279715761 //88 0.687497643352125 //89 0.698733598408304 //90 0.687622487297193 //91 0.698611498286204 //92 0.687741933068813 //93 0.698494621240856 //94 0.687856323368516 //95 0.698382639157989 //96 0.687965972491323 //97 0.698275250841838 //98 0.688071169209185 //99 0.698172179310195 //100 0.688172179310195 //1-1/2+1/3-1/4+……+1/99-1/100=0.688172179310195
------解决方案--------------------
精度问题
#include<stdio.h>
#include<stdlib.h>
int main()
{
double sum=0.0, temp=0.0;
int i, sign;
i = 1;
while(i<101)
{
sign = ((i%2) == 0? 1:-1);
int mom = i%2;
temp = 1.0/i*sign;
sum += temp;
printf("%lf\n", sum);
i++;
}
printf("sum = %lf\n",sum);
return 0;
}
问题在这个地方:
我们知道对于整形的除法运算永远是整形
即 3/2=1 7/3=2 1/2=0
所以当i=1时 1/1=1, temp=1, sum=1
当i>=2时候 1/i=0 ,temp=1, sum=1.
由此可知是精度上出了问题,解决的方案是
使用高精度数据类型 即 1.0/2 =0.5
1.0默认的是double类型 问了ok了
------解决方案--------------------
#include<stdio.h>
void main()