PIの値を計算し、それをdoubleとして返す関数を書いています。ここまでは順調ですね。ただし、関数が小数点以下14桁になると、それ以上保持できなくなります。これは、doubleの精度が限られているためだと思います。小数点以下の桁数を増やし続けるにはどうすればよいですか?
6 に答える
浮動小数点ではまったく行いません。
アルゴリズムは次のとおりです。
(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フレームワークに付属しています)を入手すると、分子と分母を好きなだけ簡単に計算できます。次に、商を小数に変換するという問題があります。それは簡単です。おそらくあなたは筆算をする方法を知っています。分子と分母に長除算アルゴリズムを実装するだけで、必要な桁数を吐き出すことができます。
どのくらいの精度が必要ですか?
を使用decimal
すると、小数点以下約 28 桁になります。
decimal pi = 3.14159265358979323846264338327950288419716939937510m;
Console.WriteLine(pi); // 3.1415926535897932384626433833
それだけでは不十分な場合は、ある種の BigDecimal 実装を検索するか、計算を実行するための他の手法を調べる必要があります。
decimal
ダブルの代わりに試してください。double までの数値を格納することはできませんが、10 進数以降の精度が向上したと思います。さらに必要な場合は、おそらく文字列を使用する必要があります。
この回答BigDecimal
で提案されているように、J# タイプを使用できます。
はい、それは double の精度が限られているためです。円周率の桁数を計算するには、さまざまな方法があります。お気に入りの検索エンジンに「円周率の計算方法」と尋ねることをお勧めします。