Можно ли получить более 100 десятичных цифр в С#?
Если да, то что является необходимой частью кода?
В Java что-то вызывает BigDecimal
, но оно все равно не может достигать более 55 цифр.
Можно ли получить более 100 десятичных цифр в С#?
Если да, то что является необходимой частью кода?
В Java что-то вызывает BigDecimal
, но оно все равно не может достигать более 55 цифр.
Загрузите J # Распространяемый, чтобы получить библиотеки классов J #. Эта статья подсказывает о том, как использовать ее для получения ZIP-возможностей в ваших проектах .NET, и немного объясняет BigDecimal, но, как объяснил Рамгаунд, статья относительно старая.
После загрузки добавьте vsjlib
в свой проект. Это не сработало для меня на .NET 4.0, но оно работало над проектом 2.0. Он содержит класс BigDecimal и другие. Не уверен, однако, если это дает вам до 100 десятичных знаков, но вы можете попробовать.
Вы можете загрузить обертку для 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 показывает, как использовать ее более подробно.
Если вы используете .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() );
}
}