題目如圖
正確答案是:#include "stdio.h"
#include "math.h"
void main()
{
double s=0,tn=1,i=1;
double sign=1;
while (fabs(tn)>=1e-4)
{
tn=sign/i;
s=s+tn;
i++;
sign=-sign;
}
printf("s=%f\n",s);
}
結果是0.693197
我沒用fabs,我的做法如下#include<stdio.h>
void main (void)
{
int i=1,n=1;
double sum=0,t=1;
while(1.0/i>=1E-4)
{
t=n*1.0/i;
sum=sum+t;
i=i+1;
n=-n;
}
printf("s=%f",sum);
}
結果是0.693097,,為什么,意思都是一樣的,都是最后一項的絕對值小于1E-4,為什么值和用fabs不一樣?
uj5u.com熱心網友回復:
題意理解有問題題目意思是最后一項的絕對值小于1e-4(參與運算,是最后一項)
你沒有把最后的這項加上
uj5u.com熱心網友回復:
i分之一就是最后一項,不考慮i的初始值為1,i++,i始終為正數
uj5u.com熱心網友回復:
i分之一就是最后一項,i的初始值為1,i++,i始終為正數,最后一項的絕對值不就是i分之一嗎
uj5u.com熱心網友回復:
最后一項是符號項乘i分之一,i的初始值為1,i++,i始終為正數,最后一項的絕對值不就是i分之一嗎uj5u.com熱心網友回復:
要不你把int改為double再試試uj5u.com熱心網友回復:
還是0.693097
uj5u.com熱心網友回復:
你對,答案錯分析如下
#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)????
*/
uj5u.com熱心網友回復:
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的,明白了吧
uj5u.com熱心網友回復:
直接在while里把i改為i-1也不嚴謹,因為i初始值為1,i-1做分母不嚴謹,所以要么第一步那個操作自己先做了,要么就考慮用答案那種方法uj5u.com熱心網友回復:
直接在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;
}
uj5u.com熱心網友回復:
題意理解有問題
題目意思是最后一項的絕對值小于1e-4(參與運算,是最后一項)
你沒有把最后的這項加上
i分之一就是最后一項,不考慮i的初始值為1,i++,i始終為正數
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的,明白了吧
我感覺7樓說的是對的
uj5u.com熱心網友回復:
題意理解有問題
題目意思是最后一項的絕對值小于1e-4(參與運算,是最后一項)
你沒有把最后的這項加上
i分之一就是最后一項,不考慮i的初始值為1,i++,i始終為正數
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的,明白了吧
意思和7樓說的有些像,但是是正確答案多加了一項
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/103044.html
標籤:C語言
