![見出し画像](https://assets.st-note.com/production/uploads/images/97091123/rectangle_large_type_2_03102eba65e400dfa014fd02edadb3b4.png?width=1200)
【C言語】悠久のπ
画像をこんなにしたら、タイトルも大袈裟になってしまった。そんなに言うほどの記事でもないんだけど。
まずは、前回記事です。
こちらに円の面積を求める課題があります。
円の面積は
$${\pi r^2}$$
で求められる簡単なものですが、難しいのは小数点。
とかく、コンピューターとは小数点が不得手である(あ、不得手なのは私か?😅)。
β版のバグ
まず、初版には不具合がありましたのでお詫びを。
面積を、次のように計算してしまいました。
(2 * PI * radius * radius)
なんてことだ。
課題は円周だっけ? 面積だっけ?
などとやっていたら、円周計算の
$${2 \pi r}$$
の2が残ってしまった。
仕様を正確に把握してからコードを書きましょう。
気を取り直して。
コード(初版)
コードはこちらです。
#define PI 3.14159265359
float area_cycle(int radius) {
return (PI * radius * radius);
}
int main(int argc, char** argv)
{
float farea = area_cycle(4);
printf("area of cycle (4) = %f\n", farea);
farea = area_cycle(65535);
printf("area of cycle (65535) = %f\n", farea);
printf("\n");
return 0;
}
そして、結果。
area of cycle (4) = 50.265484
area of cycle (65535) = 13492626432.000000
この結果を見て、ふと思う。
![](https://assets.st-note.com/img/1675377207631-w89CWbXu59.png?width=1200)
半径 65535 の結果。
小数点以下がきれいに 0 なんですけど。
たまたまでこんなことがあり得るのか?
電卓
電卓を叩く。
π×65,535×65,535
=13,492,625,932.83132
う。
![](https://assets.st-note.com/img/1675377488088-8AVDOAheka.png?width=1200)
ちょっと、ずれすぎちゃいます?
コード(double版)
型を変えてみる。
安易に「float」を選んだのだけど、「double」にしてみる。
double area_cycle_a(int radius)
{
return (PI * radius * radius);
}
double darea = 0;
darea = area_cycle_a(65535);
printf("area of cycle a (65535) = %f\n", darea);
結果
![](https://assets.st-note.com/img/1675377719044-74zjx0IiSD.png?width=1200)
お。
よさげ?
![](https://assets.st-note.com/img/1675378035126-5tWGB3Z3HR.png?width=1200)
小数第2位まで一致したぞ。
てもそこまでってなぁ。
π
πは次の数値で定義したけど。
#define PI 3.14159265359
なら電卓は?
π=3.14159265359
![](https://assets.st-note.com/img/1675378275298-qwV2BZMNdz.png)
んー?
一緒やん。
とりあえず、πの精度をもう少し上げてみる。
そんなときはこの本。
じゃーん。
![](https://assets.st-note.com/img/1675348061981-e10fcAn62g.jpg?width=1200)
「暗黒通信団」とは、なんだかアヤシゲな名前であるけど、いたってまっとうで、私が知ったきっかけは図書館に置いてあった『32ページの量子力学』という本でした。そのことはまた別の機会に。
『π』は、開けるとこんな感じ。
![](https://assets.st-note.com/img/1675378387041-U5EWjoktz1.jpg?width=1200)
1ページに 10000 桁。
定価 ¥314- だったかな(笑)。
この数値を参考にして小数以下 20 桁までのばしてみる。
3.1415926535 8979323846
コード(π 20桁)
#define PIH 3.14159265358979323846
double area_cycle_h(int radius)
{
return (PIH * radius * radius);
}
darea = area_cycle_h(65535);
printf("area of cycle h (65535) = %f\n", darea);
printf("\n");
結果
![](https://assets.st-note.com/img/1675378922158-bSNzi3UyHk.png?width=1200)
![](https://assets.st-note.com/img/1675378949486-b6oafTvFV1.png?width=1200)
おお!
よくやった、C言語!(笑)
参考
小数点以下、 20 桁まで表示してみた。
13492625932.83131 98089 59960 93750