回答編集履歴

1 説明の追加

退会済みユーザー

退会済みユーザー

2018/06/21 18:11  投稿

こんにちは
### 質問欄にあるコードを見てきになったこと
関数myatanでfor文でNまでの項を足していますがこのNは定数なのでintではなく
.```#define N 10``` などにすべきです。
---
また、関数myatanの引数xは以下の等式のxだと思われます。
![イメージ説明](37915053a0608b4223bed1bec97775b8.jpeg)
### ちなみに
このソースコードをもとに実際に計算すると分かりますが、収束が非常に遅いです。
今回はマチンの公式を使いました。収束が非常に速いです。
今回は**「マチンの公式」**を使いました。収束が非常に速いです。
詳しくは[円周率の求め方](https://mathtrain.jp/pimotomeru)をご覧ください。
![イメージ説明](072da320fada33b7e60570b25cd37f2b.jpeg)
以下、今まで述べた分のソースコードを載せておきます。
```C
#include <stdio.h>
#include <math.h>
#define N 10
double my_atan(double);
double my_atan(double x)
{
   int k;
   double sum = 0.0;
   
   for(k = 0; k < N; k++){
       sum += pow(-1.0,k) / (2 * k + 1) * pow(x,k * 2 + 1);
   }
   return sum;
}
int main(void)
{
   printf("4 * atan(1) = %.15f \n", 4 * atan(1.0));
   printf("4 * my_atan(1) = %.15f \n",4 * my_atan(1.0));
   printf("マチンの公式を使ってみる\n");
   printf("atanを使用%.15f\n",(4 * atan(0.2) - atan(1 / 239.0)) * 4);
   printf("自分で作ったmy_atanを使用:%.15f\n",(4 * my_atan(1 / 5.0) - my_atan(1 / 239.0)) * 4);
   
   return 0;
}
```
計算すると分かりますが、マチンの公式を使うとわずか10項まででここまで円周率に近づきます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る