Re: [問題] C語言新手,計算pi的精確度問題

看板C_and_CPP作者 (非天夜翔)時間15年前 (2010/03/01 18:16), 編輯推噓2(203)
留言5則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《mqazz1 (無法顯示)》之銘言: : 我聽老師說這是一個經典的問題 : 我就把我的程式碼貼上來 : 題目我打在註解裡面 : /* 印出 pi 的精確值在 10^(-j) 以內 , j由使用者輸入 : (1). the smallest i => │pi(i+1) - pi(i)│≦ 10^(-j) : (2). pi(i) : pi(0) = 4 : pi(1) = 4( 1 - 1/3 ) : pi(2) = 4( 1 - 1/3 + 1/5 ) : pi(3) = 4( 1 - 1/3 + 1/5 - 1/7 ) : => (-1)^i * ( 1 / 2i+1 ) : */ 在數學上, | pi(i) - pi(i-1) | = 4 / (2i + 1) ≦ 10^(-j) => 4 * 10^j ≦ 2i + 1 => 2 * 10^j - 1/2 ≦ i 所以,同理原題目 | pi(i+1) - pi(i) | = 4 / (2i - 1) ≦ 10^(-j) => 2 * 10^j + 1/2 ≦ i 因為 i 為正整數,取 i = 2 * 10^j + 1 printf("(1) the smallest i = %d\n",i); printf("(2) pi(i) = %lf\n",pi(i); //////////////////////////////// pi(i) = int m = (i+1) / 2; pi = ((i+1) % 2) ? 2.0/(i+0.5) : 0; for(int k = 0; k < m ; ++k) pi += 2.0/(k*(k+2)+0.75); : #include <stdio.h> : #include <stdlib.h> : #include <math.h> : double pi(int k) : { : double pi = 0.0; : int i; : for(i=0; i<k; i++) : { : if(i%2==0) : { : pi += 1.0/(2.0*i + 1.0); : } : else : { : pi -= 1.0/(2.0*i + 1.0); : } : } : return 4*pi; : } : int main() : { : int i=0, j; : printf("intput j: "); : scanf("%d", &j); : while( fabs(pi(i+1) - pi(i)) >= pow(10, -j) ) // fabs浮點絕對值,pow次方 : { : i++; : } : printf("\n"); : printf("(1)the smallest i => %d\n\n", i); : printf("(2)the pi(i) => %lf\n\n", pi(i)); : system("pause"); : return 0; : } : 可是我的程式當輸入 j=4 的時候, : 就會跑得很慢 : 有沒有什麼比較簡單的方法可以改進呢? -- 希望消失到自由的風中, 渴望解除掉束縛的羈絆。 期望悄悄的消失在風中, 感受那沒有羈絆的自由。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.74.9.2 ※ 編輯: csihcs 來自: 211.74.9.2 (03/02 02:19) ※ 編輯: csihcs 來自: 211.74.9.2 (03/02 02:21)

03/02 10:35, , 1F
推數學解, 不過從定義來看, 這樣子的 i 差一
03/02 10:35, 1F

03/02 15:46, , 2F
不懂為什麼i差1
03/02 15:46, 2F
※ 編輯: csihcs 來自: 211.74.9.2 (03/02 15:49)

03/02 19:07, , 3F
因為題目是 │pi(i+1) - pi(i)│≦ 10^(-j)
03/02 19:07, 3F

03/02 19:07, , 4F
你是用 | pi(i) - pi(i-1) |
03/02 19:07, 4F

03/02 22:11, , 5F
阿勒~~感謝提醒^^
03/02 22:11, 5F
※ 編輯: csihcs 來自: 211.74.9.2 (03/02 22:14)
文章代碼(AID): #1BZ0ICcM (C_and_CPP)
文章代碼(AID): #1BZ0ICcM (C_and_CPP)