BigDecimal
はJava.math
パッケージのクラスであり、特定の規模の大きな数を処理するために多くの利点があります。この機能を持つc#に同等のクラスまたはデータ型があります。
C#にはBigInteger
のみが組み込まれています(.NET framework 4で)。
decimal
はタスクに十分な精度ですか? ±1.0×10の範囲の値を保持できる128ビットの数値−28 ±7.9×10まで28。
つい最近、私はC#で任意精度の小数も必要とし、ここに投稿されたアイデアに出会いました: https://stackoverflow.com/a/4524254/804614
その後、ドラフトを完成させて、すべての基本的な算術演算子と比較演算子、およびすべての典型的な数値型とその時点で必要ないくつかの指数関数との間の変換をサポートしました。
確かに包括的なものではありませんが、非常に機能的で、すぐに使用できます。これは1晩のコーディングの結果であるため、この問題にバグがないことや完全に正確であることを保証することはできませんが、私にとってはうまくいきました。とにかく、ここで公開したいのは、C#で任意の精度の小数を使用する他の方法が見つからなかったからです。大規模なライブラリ(ほとんど.netでなく、C++のラッパー)を含める必要があります。もの。
基本的な考え方は、.NET 4.0のBigInteger型と10を基数とする指数(Int32)を使用して、任意の大きな仮数を持つカスタム浮動小数点型を構築することです。
バグや不正確な点を見つけたり、提案や建設的な何かをお持ちの場合は、回答を改善できるように、投稿を直接編集するかコメントを残してください。
これがこのものを配置するのに最適な場所であるかどうかはわかりませんが、これはSOの一番の質問の1つであり、本当に私のソリューションを共有したいです。;)
編集:実装をGitHubGistに移動しました: https://Gist.github.com/JcBernack/0b4eef59ca97ee931a2f45542b9ff06d
BigNumと呼ばれるC#ライブラリがあります。これは探していることを実行し、場合によっては追加の機能があります。
たとえば、BigDecimalにはない平方根関数があります。
PrecisionSpec precision = new PrecisionSpec(1024, PrecisionSpec.BaseType.BIN);
BigFloat bf = new BigFloat(13, precision);
bf.Sqrt();
Console.WriteLine(bf.ToString());
ウィキペディアには、このようなライブラリの他のリストが http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic#Libraries にあります。
ソース:
さて、BigDecimal(存在する場合)をサポートするサードパーティのライブラリを使用する以外に、簡単な回避策はありません。私が関係している限り、最も簡単な方法は、10進数の実装(たとえば、monoから)を取得し、BigInteger型を使用して書き換えることです。内部的には、monoの実装では、decimal型は3つの整数で構成されています。だから、それを実装するのは難しいとは思わない。しかし、効率についてはわかりません。ただし、最初にcodekaとして標準の10進数型の使用を検討する必要があります。
質問が最初に投稿されたとき、これはオプションではなかったかもしれませんが、C#コードでBigDecimal
を使用する非常に簡単な方法の1つは、NuGetを介して IKVM.NET パッケージをインストールすることです:
PM> Install-Package IKVM
次に、Javaの場合とまったく同じように実行します。
using System;
using Java.math;
namespace BigDecimalDemo
{
class Program
{
static void Main(string[] args)
{
int n = int.Parse(args[0]);
Console.WriteLine(Factorial(n));
}
static BigDecimal Factorial(int n)
{
return n == 1
? BigDecimal.ONE
: Factorial(n - 1).multiply(new BigDecimal(n));
}
}
}
IKVMをどこまで使用するかによって、偶発的な相互運用の問題が発生する場合がありますが、私の経験では、通常、このような単純なものに対してはうまく機能します。
https://github.com/deveel/deveel-math
NuGetパッケージ管理コンソールから、ライブラリをインストールするプロジェクトを選択し、次のコマンドを入力します
PM> Install-Package dmath