Re: [問題] C語言新手,計算pi的精確度問題
※ 引述《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
03/02 10:35, 1F
→
03/02 15:46, , 2F
03/02 15:46, 2F
※ 編輯: csihcs 來自: 211.74.9.2 (03/02 15:49)
推
03/02 19:07, , 3F
03/02 19:07, 3F
→
03/02 19:07, , 4F
03/02 19:07, 4F
→
03/02 22:11, , 5F
03/02 22:11, 5F
※ 編輯: csihcs 來自: 211.74.9.2 (03/02 22:14)
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):