2

円周率は、長い式を使用して計算しています。浮動小数点数などに慣れようとしています。doubleを使用するプログラムがあります。私のコードの問題は次のとおりです。

  1. ダブルを使用する場合、円周率は小数点以下7桁までしか正確ではありません。これ以上正確にすることはできません。
  2. long doubleを使用すると、円周率は小数点以下9桁まで正確ですが、コードの実行にははるかに時間がかかります。long doubleを使用して0.00000001未満の精度をチェックすると、piは9.4246775の値を返します。これはロングダブルによるものだと思います。

私の質問は、最も正確な変数タイプは何ですか?円周率の精度を向上させるためにコードを変更するにはどうすればよいですか?

これが私のコードです:

#include <iomanip>
#include <cstdlib>
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
 double arctan;
 double pi;
 double precision;
 double previous=0;
 int y=3;
 int loopcount=0;

   cout<<"Start\n";

   arctan=1-(pow(1,y)/y);

 do
   {
     y=y+2;
     arctan=arctan+(pow(1,y)/y);
     y=y+2;
     arctan=arctan-(pow(1,y)/y);

      pi=4*(arctan);

    //  cout<<"Pi is: ";
    //  cout<<setprecision(12)<<pi<<endl;

      precision=(pi*(pow(10,10)/10));

      loopcount++;

      if(precision-previous<0.000000001)
        break;

      previous=precision;
    }
  while(true);

  cout<<"Pi is:"<<endl;
       cout<<setprecision(11)<<pi<<endl;
  cout<<"Times looped:"<<endl;
       cout<<loopcount<<endl;

return 0;
}
4

3 に答える 3

3

std::numeric_limits から double/long double の最大制限を取得できます

#include <iostream>
#include <limits>

int main()
{
    std::cout << "     Double::digits10:  " << std::numeric_limits<double>::digits10 << "\n";
    std::cout << "Long Double::digits10:  " << std::numeric_limits<long double>::digits10 << "\n";
}

私のマシンでは、次のようになります。

     Double::digits10:  15
Long Double::digits10:  18

したがって、long double は 18 桁まで正確であると期待しています。
この用語の定義は、次の場所にあります。

http://www.cplusplus.com/reference/std/limits/numeric_limits/

標準見積もり:18.3.2 Numeric limits [limits]

また、注:コメントは上記のリストのかなり下にあります:

pow() に関する彼のアサーションで、@sarnold は正しくありません (不思議なことに、2 人のばかげた人々がチェックせずにコメントに賛成票を投じています)。彼が述べていることは C にのみ適用されます。C++ では pow() がテンプレート関数であるため、C++ には型のオーバーロードがあります。参照: http://www.cplusplus.com/reference/clibrary/cmath/pow/の標準26.4.7 complex value operations [complex.value.ops]

于 2012-03-21T00:15:42.913 に答える
1

最高精度の定義済み浮動小数点型は ですlong double

定義済みの浮動小数点型は 3 つあります。

  • float少なくとも 6 桁の精度を持つ
  • double少なくとも 10 個、少なくともfloat
  • long double少なくとも 10 個、少なくともdouble

これらは最小要件です。これらのタイプのいずれかまたはすべての精度が高くなる可能性があります。

long double提供できる以上の精度が必要な場合は、任意の精度をサポートするGMPを調べることができます (速度とメモリ使用量がかなり犠牲になります)。

于 2012-03-21T00:47:29.707 に答える
-3

または、PI の数字をハードコーディングして、何が起こるかを確認することもできます。^_^

http://www.joyofpi.com/pi.html

于 2012-03-21T00:23:44.713 に答える