Подтвердить что ты не робот

Как я могу получить более 100 десятичных цифр в С#?

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

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

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

4b9b3361

Ответ 1

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

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

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

Использование MPIR - многоточечные интегралы и рационалы

Вы можете загрузить обертку для 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 показывает, как использовать ее более подробно.

Ответ 2

Если вы используете .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() );

    }
}