このコードを考えてみましょう:
double result = Math.Sqrt(4746073226998689451);
結果として、2178548421.99999954などの代わりに2178548422を取得します...より正確な結果を取得するにはどうすればよいですか?
ウィキペディアで言及されている.NET用の高精度の数学ライブラリがたくさんあります-任意-percisionartithmaticページ。
ウィキペディアのリンクが壊れていて、現在他の場所でライブラリを見つけることができませんが、BigNumがここで推奨されているのを見たことがあります。
このページの他のオプションは、MPIRのC#バインディングです。
平方根を計算する特定の問題については、10進型とニュートンのアルゴリズムを使用できます。
using System;
class Program
{
public static void Main()
{
long x = 4746073226998689451;
decimal sqrt_x = (decimal)Math.Sqrt(x);
for (int i = 0; i < 10; ++i)
sqrt_x = 0.5m * (sqrt_x + x / sqrt_x);
Console.WriteLine("{0:F16}", sqrt_x);
}
}
結果は次のとおりです。
2178548421.9999998547197773
桁ごとの計算を使用すると、探している桁数が得られます。
doubleの代わりに、大きな整数を試して、このリンクもチェックしてください