マチンの公式を用いて円周率を求めるプログラムを作ったのですが、微妙に(3.1423666...)間違っています。
たぶん、配列repynの初期設定が違っているのだと思いますが、どうすればいいのでしょう?
教えてください。
関数:
add 配列型のデータ同士を加算する。
subtract 配列型のデータ同士を減算する。
divide 配列型のデータとint型の変数を除算する。
確認してあるので、関数に間違いはないと思います。
int main(void)
{
int *repyn,*tn,*pi;
int i;
repyn=(int *)calloc(DIGIT,sizeof(int));
tn=(int *)calloc(DIGIT,sizeof(int));
pi=(int *)calloc(DIGIT,sizeof(int));
for(i=0;i<DIGIT;i++) *(pi+i)=0;
for(i=0;i<DIGIT;i++) *(repyn+i)=0;
*(repyn+1)=8;
*(repyn+2)=0;
i=1;
do{
divide(repyn,5*5,repyn);
divide(repyn,i,tn);
add(pi,tn,pi);
i+=2;
divide(repyn,5*5,repyn);
divide(repyn,i,tn);
subtract(pi,tn,pi);
i+=2;
}while(i<=CN1);
for(i=0;i<DIGIT;i++) *(repyn+i)=0;
*(repyn+0)=9;
*(repyn+1)=5;
*(repyn+2)=6;
i=1;
do{
divide(repyn,239,repyn);
divide(repyn,239,repyn);
divide(repyn,i,tn);
subtract(pi,tn,pi);
i+=2;
divide(repyn,239,repyn);
divide(repyn,239,repyn);
divide(repyn,i,tn);
add(pi,tn,pi);
i+=2;
}while(i<=CN2);
for(i=0;i<DIGIT;i++){
printf("%d",*(pi+i));
}
return 0;
}
No.2ベストアンサー
- 回答日時:
add, subtract, divideが間違ってるかも。
-------------------------------
const int kK = 10;
void add(int a[] , int b[] , int c[])
{
int i,cy=0;
for(i=DIGIT-1 ; i>=0 ; i--){
c[i]=(int)(a[i]+b[i]+cy);
if(c[i]<kK)
cy=0;
else{
c[i]=(int)(c[i]-kK);
cy=1;
}
}
}
void subtract(int a[] , int b[] , int c[])
{
int i,cy=0;
for(i=DIGIT-1 ; i>=0 ; i--){
c[i]=(int)(a[i]-b[i]+cy);
if(c[i]>0)
cy=0;
else{
c[i]=(int)(kK+c[i]);
cy=-1;
}
}
}
void divide(int a[] , int b, int c[])
{
int i;
long d,rem=0;
for(i=0;i<DIGIT;i++){
d=a[i];
c[i]=(int)((d+rem)/b);
rem=((d+rem)%b)*kK;
}
}
参考URL:http://www.ccad.sccs.chukyo-u.ac.jp/~mito/ss/pro …
回答ありがとうございます。
ご指摘のとおり関数が間違っていました。
一応載せておきます。
/*多数桁加算*/
void add(int *a,int *b,int *result)
{
/*carryは繰り上げ、iは制御変数*/
int carry,i;
/*carryの初期化*/
carry=0;
/*result=a+bの演算*/
for(i=DIGIT1-1;i>=0;i--){
*(result+i)=*(a+i)+*(b+i)+carry;
if(*(result+i)>=10){
*(result+i)-=10;
carry=1;
}
else carry=0;
}
}
/*多数桁減算*/
void subtract(int *a,int *b,int *result)
{
/*borrowは繰り下げ、iは制御変数*/
int borrow,i;
/*borrowの初期化*/
borrow=0;
/*result=a-bの演算*/
for(i=DIGIT1-1;i>=0;i--){
*(result+i)=*(a+i)-*(b+i)-borrow;
if(*(result+i)<0){
*(result+i)+=10;
borrow=1;
}
else borrow=0;
}
}
/*多数桁除算*/
void divide(int *a,int b,int *result)
{
/*remは余り、iは制御変数*/
int rem1,rem2,i;
/*result=a/bの演算*/
rem2=0;
for(i=0;i<DIGIT1;i++){
rem1=(*(a+i)+rem2*10)%b;
*(result+i)=(*(a+i)+rem2*10-rem1)/b;
rem2=rem1;
}
}
No.1
- 回答日時:
どなたもアドバイスがないようなので少々コメントさせていただきます。
マチンの公式
(π/4)=4×arctan(1/5)-arctan(1/239)
ですね。
ということは、
π= 16 * arctan(1/5) - 4 * arctan(1/239)
arctan x = x - x^3/3 + x^5/5 - x^7/7 + x^9/9 ....
とりあえず項ごとの収束値を算出し、間違いを探ってみてはいかがでしょう。
arctan(1/5) ≒ 0.1973955...
arctan(1/239) ≒ 0.0041840...
16*arctan(1/5) ≒ 3.15832895....
4*arctan(1/239) ≒ 0.01673630...
16*arctan(1/5) - 4*arctan(1/239) ≒ 3.14159265...
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- 統計学 連続型の確率変数について 6 2023/08/25 08:44
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
if と配列の組み合わせ
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
比較回数と交換回数表示について
-
C言語 エラーの原因がわからな...
-
【C++】関数ポインタの使い方
-
インライン展開されているか確...
-
構造体の勉強中です 合計点の高...
-
双子の素数
-
c言語
-
最早開始時間と最遅完了時刻を...
-
「{ } で囲むだけ」は正しい?
-
実数の整数部,小数部の取得
-
シグマ公式・・・C言語
-
c++でサインカーブ、コサインカ...
-
C2601 ローカル関数の定義について
-
acceptをalarmでタイムアウトさ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
c++でテンプレートのコードでわ...
-
(int *)の意味
-
ラップ関数とはどんなものですか?
-
数字列を3桁ごとにカンマで区切...
-
c言語のリダイレクトによる円...
-
比較回数と交換回数表示について
-
実数の整数部,小数部の取得
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
PowerShellがうまくいかない
-
c言語の配列を使ってサイコロを...
-
課題でつまってます・・・
-
C言語のサイコロシミュレート
-
エラー 添字が付けられた値が、...
おすすめ情報