10

System.Numerics.BigInteger大きな整数を掛け合わせることができますが、浮動小数点数に同じタイプのものはありますか?そうでない場合、使用できる無料のライブラリはありますか?

//this but with floats
System.Numerics.BigInteger maxint = new BigInteger(int.MaxValue);

System.Numerics.BigInteger big = maxint * maxint * maxint;
System.Console.WriteLine(big);
4

2 に答える 2

18

おそらくあなたはBigRationalを探していますか?Microsoftは、CodePlexのBCLプロジェクトでリリースしました。実際にどのように、またはそれがあなたのニーズに合うかどうかはわかりません。

有理数として保持します。キャストまたは乗算のいずれかによって、10進値の文字列を取得できます。

var r = new BigRational(5000, 3768);
Console.WriteLine((decimal)r);
Console.WriteLine((double)r);

または、次のような単純な(ish)拡張メソッドを使用します。

public static class BigRationalExtensions
{
    public static string ToDecimalString(this BigRational r, int precision)
    {
        var fraction = r.GetFractionPart();

        // Case where the rational number is a whole number
        if(fraction.Numerator == 0 && fraction.Denominator == 1)
        {
            return r.GetWholePart() + ".0";
        }

        var adjustedNumerator = (fraction.Numerator
                                           * BigInteger.Pow(10, precision));
        var decimalPlaces = adjustedNumerator / fraction.Denominator;

        // Case where precision wasn't large enough.
        if(decimalPlaces == 0)
        {
            return "0.0";
        }

        // Give it the capacity for around what we should need for 
        // the whole part and total precision
        // (this is kinda sloppy, but does the trick)
        var sb = new StringBuilder(precision + r.ToString().Length);

        bool noMoreTrailingZeros = false;
        for (int i = precision; i > 0; i--)
        {
            if(!noMoreTrailingZeros)
            {
                if ((decimalPlaces%10) == 0)
                {
                    decimalPlaces = decimalPlaces/10;
                    continue;
                }

                noMoreTrailingZeros = true;
            }

            // Add the right most decimal to the string
            sb.Insert(0, decimalPlaces%10);
            decimalPlaces = decimalPlaces/10;
        }

        // Insert the whole part and decimal
        sb.Insert(0, ".");
        sb.Insert(0, r.GetWholePart());

        return sb.ToString();
    }
}

10進数または2進数の精度範囲外の場合は、0.0の値でそれぞれのタイプにキャストされます。また、結果が範囲外の場合に10進数にキャストすると、OverflowExceptionがスローされます。

私が書いた拡張メソッド(分数の小数表現を計算するための最良の方法ではないかもしれません)は、無制限の精度で文字列に正確に変換します。ただし、数値が要求された精度よりも小さい場合は、10進数またはdoubleの場合と同様に、0.0が返されます。

于 2012-04-28T00:16:42.823 に答える
0

タイプがあった場合の影響を考慮する必要がありますBigFloat

BigFloat x = 1.0;
BigFloat y = 3.0;
BigFloat z = x / y;

答えは0.333333333333333333333333333333333333333333333333333333繰り返されるでしょう。永遠に。無限。メモリ不足エラー。

無限を構築するのは簡単BigFloatです。

ただし、有理数に固執することに満足している場合、有理数は、実数を表すために任意の精度を提供できる型BigIntegerを構築するために使用できるものよりも、ある整数を別の整数で除算することによって表現されます。BigRational

BigRational x = 1;
BigRational y = 3;
BigRational z = x / y;

これは機能し、このタイプを提供します。

3分の1

NuGetBigRationalを使用するだけで、Microsoftからの実装を含む多くの実装を見つけることができます。

于 2020-11-27T06:47:42.777 に答える