Большие числа с поддержкой дроби - PullRequest
4 голосов
/ 28 марта 2010

Мне нужен номер c #, который может обрабатывать очень большие числа, но также поддерживает дробь, я посмотрел System.Numberics.BigInteger, выходящий в .NET 4.0, но не могу заставить его работать с дробями.

something i = 2;
something j = 5;
something k = i/j; //should be 0.4

когда я пытался

 BigInteger i = 2;
 BigInteger j = 5;
 double d = (double)(i/j); //d is 0.0

Кто-нибудь знает такую ​​библиотеку?

Ответы [ 9 ]

10 голосов
/ 28 марта 2010

F # PowerPack содержит числовой тип BigRational. Он реализован на F # и предназначен для F #, но тип также должен быть полностью применим из C # (включая перегруженные операторы и тому подобное). PowerPack - это дополнительная библиотека с дополнительными функциями F #, поэтому она не является частью .NET Framework, но это поддерживаемый продукт от Microsoft.

Тип BigRational поддерживает все основные операторы (+, /, -, *, >, <, >=, <=, ==, !=), и я считаю, что он автоматически сохраняет нормальную форму числа. Если бы вы представляли число как два BigInteger значения, вам нужно было бы выполнить сравнение таким образом, чтобы 1/2 равнялось 2/4 .

2 голосов
/ 28 марта 2010

Выезд http://www.extremeoptimization.com/Documentation/Mathematics/Arbitrary_Precision_Arithmetic/Arbitrary_Precision_Rationals.aspx

Хотя, может быть, вы просто хотите сделать это: double d = ((double)i) / ((double)j);

1 голос
/ 28 марта 2010

Рассмотрим, достаточно ли велик класс Десятичный :

Тип десятичного значения представляет десятичные числа от положительных 79.228.162.514.264.337.593.543.950.335 к отрицательному 79.228.162.514.264.337.593.543.950.335. Тип десятичного значения подходит для финансовых расчетов, требующих большое количество значимого интеграла и дробные цифры и без округления ошибки.

Если вы хотите стать по-настоящему большим, найдите библиотеку "bignum", такую ​​как GMP (и google для bindings ).

1 голос
/ 28 марта 2010

Я однажды использовал эту библиотеку: W3b.Sine . Это:

Десятичное число произвольной точности библиотека разработана в C #.

Вы также можете попробовать http://www.fractal -landscapes.co.uk / bigint.html . Однако у меня нет опыта его использования.

0 голосов
/ 24 апреля 2013

Эксперимент BigRational в BCL Codeplex на основе BigInterger

0 голосов
/ 28 марта 2010

Каков диапазон для ваших «очень больших чисел»?

System.Double.MaxValue = 1.7976931348623157E + 308 , что для меня кажется довольно большим числом ( MSDN Double.MaxValue )

0 голосов
/ 28 марта 2010

Буду ли я вообще что-нибудь значить? Это экземпляры класса, вам нужно использовать BigInteger.Divide (i, j)

Хотя он предназначен для работы с целыми числами, поэтому я должен представить, что он отбросит любой остаток. Который, если он поддерживает прямое деление без вызова функции, вот почему вы получаете 0.

0 голосов
/ 28 марта 2010

Это должно дать хорошее приближение, преобразовав рациональное число двух BigIntegers в двойное:

struct BigRational
{
    BigInteger numerator;
    BigInteger denominator;

    public double ToDouble()
    {
        BigInteger quotient;
        BigInteger remainder;

        quotient = BigInteger.DivRem(numerator, denominator, out remainder);

        return (double)quotient + (double)remainder / (double)denominator;
    }
}
0 голосов
/ 28 марта 2010

BigInteger поддерживает только то, что написано на олово - целые числа, а дроби нет.

Тип данных double поддерживает двоичные числа с плавающей запятой от ± 5,0 × 10 −324 до ± 1,7 × 10 308 , а decimal поддерживает десятичные числа с плавающей запятой от ± 1,0 × 10 -28 до ± 7,9 × 10 28 . В ответе Гейба упоминаются классы, которые вы можете использовать для моделирования дробей, но придерживайтесь примитивных типов данных, если диапазоны достаточны.

...