Как я могу получить более 100 десятичных цифр в C #? - PullRequest
13 голосов
/ 25 октября 2011

Можно ли получить более 100 десятичных цифр в C #?

Если да, какая часть кода необходима?

В Java что-то называется BigDecimal, но оно не может содержать более 55 цифр.

Ответы [ 2 ]

9 голосов
/ 25 октября 2011

Использование библиотек J #:

Загрузите распространяемый J # , чтобы получить библиотеки классов J #. Эта статья намекает о том, как использовать ее для получения возможности ZIP в ваших проектах .NET, и объясняет немного о BigDecimal, но, как объяснил Ramhound, статья довольно старая.

После загрузки добавьте vsjlib в ваш проект. Он не работал для меня на .NET 4.0, но он работал на проекте 2.0. Среди прочего, он содержит класс BigDecimal. Однако не уверен, что это даст вам до 100 знаков после запятой, но вы можете попробовать.

Использование MPIR - Multi Precision Integer и Rationals

Вы можете загрузить оболочку для библиотеки MPIR для .NET здесь (скачать версию 0.2) . Затем выполните следующие действия:

  • Добавьте файлы \wrapper.*.dll в свой проект, убедитесь, что на каждой сборке они скопированы в каталог Debug или Release.
  • Добавить \wrapper\xmpir.cs в ваш проект
  • Добавьте следующий код в ваш проект:

    // set the precision to 512 bits (adjust this to your needs)
    mpir.mpf_set_default_prec(512);
    ulong default_prc = mpir.mpf_get_default_prec();
    
    // init vars (important!)
    mpir.mpf_t val = mpir.mpf_init_set_d(.5);
    mpir.mpf_t result = mpir.mpf_init_set_ui(0);
    
    // calculate 0.5^200
    mpir.mpf_pow_ui(result, val, 200);
    double dresult = mpir.mpf_get_d(result);
    
    // convert result to a string, in the form 1.2345 (dot not in output) and exp holding exponent
    long exp;
    string sresult = mpir.mpf_get_string(out exp, 10, 0, result);
    
    // free vars (important!)
    mpir.mpf_clear(val);
    mpir.mpf_clear(result);
    

Обратите внимание, что переменная sresult будет содержать только значащие цифры. Вам также нужно будет добавить логику для печати показателя степени или связки нулей.

Результат 6.2230152778611417071440640537801242405902521687211671331011166147896988340353834411839448231257136169569665895551224821247160434722900390625E-60

A документация PDF-файл в полной библиотеке MPIR показывает, как использовать его более подробно.

0 голосов
/ 25 октября 2011

Если вы используете .net Framework 4.0, вы можете обратиться к сборке System.Numerics. или вы можете скачать BigInteger из codeplex

Использование BigIngeger: http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx

например:

string positiveString = "91389681247993671255432112000000";
string negativeString = "-90315837410896312071002088037140000";
BigInteger posBigInt = 0;
BigInteger negBigInt = 0;

try {
   posBigInt = BigInteger.Parse(positiveString);
   Console.WriteLine(posBigInt);
}
catch (FormatException)
{
   Console.WriteLine("Unable to convert the string '{0}' to a BigInteger value.", 
                     positiveString);
}

if (BigInteger.TryParse(negativeString, out negBigInt))
  Console.WriteLine(negBigInt);
else
   Console.WriteLine("Unable to convert the string '{0}' to a BigInteger value.", 
                      negativeString);

// The example displays the following output:
//   9.1389681247993671255432112E+31
//   -9.0315837410896312071002088037E+34

Редакция: здесь есть проект bigNum http://sine.codeplex.com/

using W3b.Sine;

public class ExpressionSample {

    public static void Main(String[] args) {

        Dictionary<String,BigNum> symbols = new Dictionary<String,BigNum>() {
            {"x", 100} // the implicit conversion defined
        };

        Expression expression = new Expression("1 + 2 / 3 * x");
        BigNum result = expression.Evaluate( symbols );
        Console.WriteLine( expression.ExpressionString + " == " + result.ToString() );

        BigNum x = 100;
        BigNum xPow100 = x.Pow( 100 );
        Console.WriteLine("100^100 == " + xPow100.ToString() );

    }
}
...