-1

C++でこれを行うことは可能です

ifndef M_PI
 define M_PI          3.141592653589793238462643383279502884
endif

ただし、C# では double var を宣言し、36 桁の PI の値を割り当てようとしました。double は小数点以下 16 桁まで格納されるため、これは機能しません (MSDN docx)。暗黙的な型のローカル変数を作成しようとしましたが、コンパイラはそれを double として宣言しただけで、振り出しに戻ってしまいました。多分私はcmathC#に含めることができますか?

C# で PI を小数点以下 36 桁に定義するにはどうすればよいですか?

4

5 に答える 5

4

C++ ではできて C# ではできないことは、リテラルのエイリアスを作成することです。C++ での記述は36 の場所に#define M_PI 3.141592653589793238462643383279502884定義されていません。PIリテラルにエイリアスを付けるだけです。

#define M_PI 3.141592653589793238462643383279502884
double pi = M_PI;   

書き方は全く同じです

double pi = 3.141592653589793238462643383279502884;

これは、c++ と C# の両方でほとんど同じように機能します。c++ では、値は C# と同じ精度になります。これは、リテラルが に解釈されるためdoubleです。これは、両方で本質的に同じであると考えられます。

が 36 桁までと宣言されている理由M_PIは、これが の最大精度であるためquad doubleです。残念ながら、C# にはそのような精度を持つネイティブ型はありません。M_PIC++ では、 として使用しない限り、特別なものは得られませんquad double

エイリアス化されたリテラルを使用しても、次のように記述できるだけではあまり役に立ちません。

    float pif = M_PI;
    int pii = M_PI;
    double pid = M_PI;
    quad double piq = M_PI;

残念ながら、カスタム タイプを使用する必要があります。

于 2015-02-24T22:01:54.343 に答える
3

私の知る限り、C# の decimalの精度は最高ですが、10 進数の有効桁数は 28 ~ 29 桁までです。カスタム ライブラリを使用せずに、C# で最大 36 桁の 10 進数をカバーできるとは思いません。

于 2015-02-24T21:39:49.463 に答える
2

C# で円周率を 100 万桁まで計算する記事はこちらです。36 桁まで絞り込むことができます。

ここにサンプル コードがあります。記事全体とその背後にあるロジックを読むことをお勧めします。

public static HighPrecision GetPi(int digits)
{
    HighPrecision.Precision = digits;
    HighPrecision first = 4 * Atan(5);
    HighPrecision second = Atan(239);
    return 4 * (first - second);
}

pi を保存する (計算しない) だけの場合は、ここHighPrecisionから値をコピーして変数に保存できます。

于 2015-02-24T21:46:48.943 に答える
1

それだけの精度が本当に必要な場合は、 GNU MPCGNU MPFRなどの任意精度の C ライブラリを使用できます。それらはCライブラリであるため、それらを使用するには相互運用を使用する必要があります...しかし、それにより、選択したパッケージの使用に高精度の使用が制限されます...pi

于 2015-02-24T21:41:08.553 に答える