■この記事の概要
この記事では、C言語でライプニッツの公式を使って円周率を計算する短いプログラムを紹介しています。公式の数学的背景を説明しつつ、反復回数を変化させた際の計算精度の変化を実行結果とともに示しています。また、浮動小数点の円周率を高精度で表示する方法についても解説しています。
■ライプニッツの公式
π/4 = 1 – 1/3 + 1/5 – 1/7 + 1/9 – 1/11 + …
■円周率πを求めるC言語プログラム
//ライプニッツの公式
// π/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ...
#include <stdint.h>
#include <stdio.h>
void 円周率計算(uint64_t 反復回数) {
long double pi = 0.0L ;
int 符号 = 1;
uint64_t 分母 = 1;
for (uint64_t i = 0; i < 反復回数; i++) {
pi += (long double)符号 / 分母;
符号 *= -1;
分母 += 2;
}
printf("円周率=%.20Lf\t反復回数=%ld回\n", pi*4,反復回数);
}
int main(void) {
for(uint64_t 反復回数 = 10; 反復回数 <= 1000000000UL; 反復回数 *= 10){
円周率計算(反復回数);
}
}
./a.out
円周率=3.04183961892940221109 反復回数=10回
円周率=3.13159290355855276437 反復回数=100回
円周率=3.14059265383979292654 反復回数=1000回
円周率=3.14149265359004324053 反復回数=10000回
円周率=3.14158265358979349176 反復回数=100000回
円周率=3.14159165358979318525 反復回数=1000000回
円周率=3.14159255358979309708 反復回数=10000000回
円周率=3.14159264358979407840 反復回数=100000000回
円周率=3.14159265258979522790 反復回数=1000000000回
■浮動小数点の円周率を出来るだけ正確に表示する書式
//浮動小数点の円周率をできるだけ正確に表現する書式
#include <stdio.h>
#define M_PI 3.14159265358979323846 /* pi */
#define M_PIL 3.14159265358979323846L /* piL */
int main(void)
{
printf("円周率: %f~\t定数\n", M_PI);
printf("円周率: %.20f~\t定数\n", M_PI);
printf("円周率: %.20Lf~\tL定数\n", M_PIL);
printf("円周率: 3.14159265358979323846~\t文字列\n");
}
./a.out
円周率: 3.141593~ 定数
円周率: 3.14159265358979311600~ 定数
円周率: 3.14159265358979323851~ L定数
円周率: 3.14159265358979323846~ 文字列