5

PIの値を計算し、それをdoubleとして返す関数を書いています。ここまでは順調ですね。ただし、関数が小数点以下14桁になると、それ以上保持できなくなります。これは、doubleの精度が限られているためだと思います。小数点以下の桁数を増やし続けるにはどうすればよいですか?

4

6 に答える 6

16

浮動小数点ではまったく行いません。

アルゴリズムは次のとおりです。

(1 + 1 / (2 * 1 + 1)) *  
(1 + 2 / (2 * 2 + 1)) *  
(1 + 3 / (2 * 3 + 1)) *  
(1 + 4 / (2 * 4 + 1)) *  
(1 + 5 / (2 * 5 + 1)) *  
(1 + 6 / (2 * 6 + 1)) *  
(1 + 7 / (2 * 7 + 1)) *  ...

分数を計算する途中のすべての段階。その分数を分子/分母の形で単純に保持してみませんか?計算する分数は次のとおりです。

(4 / 3) * 
(7 / 5) *
(10 / 7) *
(13 / 9) * ...

これは、上部が4 * 7 * 10 * 13 ...で、下部が3 * 5 * 7*9です。

BigIntegerクラス(System.Numericsの4.0フレームワークに付属しています)を入手すると、分子と分母を好きなだけ簡単に計算できます。次に、商を小数に変換するという問題があります。それは簡単です。おそらくあなたは筆算をする方法を知っています。分子と分母に長除算アルゴリズムを実装するだけで、必要な桁数を吐き出すことができます。

于 2010-11-05T15:12:17.090 に答える
8

どのくらいの精度が必要ですか?

を使用decimalすると、小数点以下約 28 桁になります。

decimal pi = 3.14159265358979323846264338327950288419716939937510m;
Console.WriteLine(pi);    // 3.1415926535897932384626433833

それだけでは不十分な場合は、ある種の BigDecimal 実装を検索するか、計算を実行するための他の手法を調べる必要があります。

于 2010-11-05T14:59:43.057 に答える
1

任意の精度で作業できるライブラリがいくつかあります。1 つはW3b.sineですが、他のいくつかはwikipediaで説明されています。

于 2010-11-05T15:02:05.237 に答える
1

decimalダブルの代わりに試してください。double までの数値を格納することはできませんが、10 進数以降の精度が向上したと思います。さらに必要な場合は、おそらく文字列を使用する必要があります。

于 2010-11-05T15:02:55.017 に答える
0

この回答BigDecimalで提案されているように、J# タイプを使用できます。

于 2010-11-05T15:01:49.300 に答える
0

はい、それは double の精度が限られているためです。円周率の桁数を計算するには、さまざまな方法があります。お気に入りの検索エンジンに「円周率の計算方法」と尋ねることをお勧めします。

于 2010-11-05T15:00:01.070 に答える