Gregory Leibniz 式を使用して pi を推定するプログラムを作成しましたが、小数点以下 18 桁まで計算されません。小数点以下 5 桁までしか計算されません。助言がありますか?
2 に答える
使用する
cout.precision(50);
印刷出力の精度を上げるため。ここで、50 は出力の 10 進数の桁数です。
精度は、小数点文字の後に表示される正確な桁数を指定します。デフォルトの精度は 6 です
同様にstd::cout
が C++ に導入されたとき、同じデフォルト値が使用されました
によって実行される浮動小数点出力の精度 (つまり、生成される桁数) を管理し
std::num_put::do_put
ます。
- 現在の精度を返します。
- 精度を指定された精度に設定します。以前の精度を返します。
によって確立されるデフォルトの精度
std::basic_ios::init
は 6 です。
したがって、型がどれほど正確であっても、小数部の 6 桁のみが出力されます。std::setprecision
より多くの桁を取得するには、またはを使用する必要がありますstd::cout.precision
ただし、呼び出しは出力のstd::cout.precision
10 進数の桁数にのみ影響し、数値の実際の精度には影響しません。その型の精度を超える数字はゴミになります
最新のシステムのほとんどは、IEEE-754 を使用します。IEEE-754float
は、仮数が 23 ビットの単精度であり、仮数が 52 ビットの倍精度double
にマップされます。その結果、それぞれ 6 ~ 7 桁と 15 ~ 16 桁の精度になります。つまり、期待どおりに小数点以下 18 桁まで数値を表すことができないということです。
一部のプラットフォームでは、数値をより正確に格納できる拡張精度型がいくつかある場合があります。たとえばlong double
、x86 のほとんどのコンパイラでは 64 ビットの精度があり、最大 18 桁の有効数字を表すことができますが、小数点以下 18 桁ではありません。一部のコンパイラでは、 4 倍精度でより高い精度を得ることができます。さらに精度を上げるには、大きな数のライブラリを使用するか、独自のライブラリを作成するしかありません。