💭

C のプログラムで円周率が欲しいとき

2021/12/16に公開

プログラミングをしていて円周率が欲しくなる場面は多々あると思います.

定数 M_PI を使う (非推奨)

あなたが,math.h を include したときに定数 M_PI が定義されるような恵まれた規格外の環境にいて,移植性を全く考えないような行儀の悪いプログラミングを許す場合は,M_PI を円周率の値として利用することができます.

test.c
#include <stdio.h>
#include <math.h>

int
main(int argc, char *argv[])
{
	printf("M_PI is %f\n", M_PI);

	return 0;
}
% gcc test.c
% ./a.out
M_PI is 3.141593
% c89 test.c 
test.c: In function 'main':
test.c:7:25: error: 'M_PI' undeclared (first use in this function)
    7 |  printf("M_PI is %f\n", M_PI);
      |                         ^~~~
test.c:7:25: note: each undeclared identifier is reported only once for each function it appears in

逆正接を使う

円周率といえば,\pi = 4 \arctan(1) は有名です. これならどんな環境でも使えますが,得られる値の精度がどのようであるかはなんとも言えません.

test.c
#include <stdio.h>
#include <math.h>

int
main(int argc, char *argv[])
{
	printf("4 * atan(1) is %f\n", 4 * atan(1));

	return 0;
}
% gcc test.c
% ./a.out
4 * atan(1) is 3.141593
% c89 test.c
% ./a.out 
4 * atan(1) is 3.141593

自分で定義する

これなら誰も文句を言わないでしょう.

test.c
#include <stdio.h>

#define MY_PI	3.141592653589793238462643

int
main(int argc, char *argv[])
{
	printf("MY_PI is %f\n", MY_PI);

	return 0;
}
% gcc test.c
% ./a.out 
MY_PI is 3.141593
% c89 test.c
% ./a.out 
MY_PI is 3.141593

おわりに

おわりです.

Discussion