精度を深く求めずにC++で気楽に円周率をつかう。
C++11,C++14,C++17直接入力する。
const double PI=3.0;
const double PI=3.14;
const double PI=3.14159;
const double PI=3.141592653589;
const double PI=3.141592653589793; #NASA 15桁
const double PI=3.1415926535897932;
const double PI=3.14159265358979323846;
const double PI=3.1415926535897932384626433832795028841971; #宇宙 40桁
自分の好きな桁数を設定します。
定数は大文字にする、constをつける、計算しないので一番早いと思います。
NASA(アメリカ航空宇宙局)が軌道計算に使う桁数は15桁です。
これを地球の半径で計算してみると、円周の誤差は分子一個分の差程度に落ち着きます。
気をつけるべき点は「値が正確か」ではなく「円周率の桁数を減らしたことで、どれだけの誤差が生じたか」です。
宇宙全体は半径にして約465億光年となります、円周の誤差が最も単純な原子である水素原子の直径0.1ナノメートルほどの誤差しか生じないよう正確に計算するにはどれだけの円周率の桁を使わないといけないかを逆算すると39~40桁になります。
#defineを使う
# define PI 3.14159265359
軽さと使いやすさを兼ねる
計算して出す
# include <bits/stdc++.h>
const double PI = acos(-1);
その他の計算方法もあり
ライブラリから使う
# include <bits/stdc++.h>
(これが一番安心)
数値を固定小数点形式で表示する
倍精度実数型変数に入っている数値を、
小数点以下の桁数を指定して
固定小数点形式で表示するには,
fixedとsetprecision()を使う。
# include <iostream>
# include <iomanip>
using namespace std;
int main(){
cout << fixed << setprecision(5);
double a=1.23;
cout << a << endl;
1.23000
おまけ 1
acosについて
// C++11 から追加
acosのdouble型
double acos(Integral x);
// C++17 から追加
acosf
acosのfloat型
float acosf(float x);
acosl
acosのlong double型
long double acosl(long double x);
acos(-1)をループ内に入れるなどをした場合の計算について。
コンパイル時に計算されて定数化されていると思うので速度は同じかもしれない。
おまけ 2
表示にprintfを使う
printf("%.5f", x);
小数点以下5桁を表示する。
おまけ 3
表示にfixed、setprecisionをつかう。
小数点以下5桁を表示する。
cout << fixed << setprecision(5);
これはmainの直下に置いておくことで関数内全体に影響される。
変えたい場合はその直前に置く。
# include <iomanip>
# include <iostream>
using namespace std;
int main() {
cout << fixed << setprecision(5);
double a = 1.23;
cout << a << endl;
cout << a << endl;
cout << a << endl;
cout << fixed << setprecision(2);
cout << a << endl;
1.23000
1.23000
1.23000
良いC++ライフを!