Int128 в.Net?
Мне нужно сделать несколько больших целых чисел. Существуют ли классы или структуры, представляющие 128-битное целое число и реализующие все обычные операторы?
Кстати, я понимаю, что десятичную можно использовать для представления 96-битного Int.
13 ответов
Это здесь, в System.Numerics. "Тип BigInteger - это неизменный тип, представляющий произвольно большое целое число, значение которого в теории не имеет верхних или нижних границ".
var i = System.Numerics.BigInteger.Parse("10000000000000000000000000000000");
В то время как BigInteger
является лучшим решением для большинства приложений, если у вас есть численные вычисления, критичные к производительности, вы можете использовать полный Int128
а также UInt128
реализации в моей библиотеке Dirichlet.Numerics. Эти типы полезны, если Int64
а также UInt64
слишком маленькие, но BigInteger
слишком медленно
System.Int128
иSystem.UInt128
доступны начиная с .NET Core 7.0 Preview 5
Они были реализованы в Добавлении поддержки типов данных Int128 и UInt128.
Я не знаю, почему их нет в .NET 7 Preview 5 , но в грядущем анонсе .NET 7 Preview 6 также будетанонсеInt128Converter
и
UInt128Converter
для новых типов в Preview 5
Однако у них еще не было поддержки C# , как иSystem.Half
, поэтому вам придется использоватьInt128
явно вместо использования собственного ключевого слова C#
Нет, в.NET нет ничего = 3.5. Я надеюсь / ожидаю, что BigInteger вернется в.NET 4.0. (Он был вырезан из.NET 3.5.)
BigInteger - теперь стандартная часть C# и друзей в.NET 4.0. См. Блог Гуннара Пейпмана на ASP.NET. Обратите внимание, что ЦП обычно может работать с обычными целыми числами намного быстрее и в постоянное время, особенно при использовании обычных математических операторов (+, -, /, ...), потому что эти операторы обычно отображаются непосредственно в отдельные инструкции ЦП.
С BigInteger даже самые простые математические операции - это гораздо более медленные вызовы функций для методов, время выполнения которых зависит от размера числа. Это потому, что BigInteger реализует арифметику произвольной точности, которая добавляет значительные, но необходимые накладные расходы. Преимущество заключается в том, что BigIntegers ограничены не 64 или даже 128 битами, а доступной системной памятью (или примерно 2^64 битами точности, в зависимости от того, что наступит раньше). Читайте здесь.
GUID поддерживается 128-битным целым числом в.NET Framework; хотя это не идет ни с одним из типичных методов целочисленного типа.
Я написал обработчик для GUID, прежде чем рассматривать его как 128-битное целое число, но это было для компании, в которой я работал ~8 лет назад. У меня больше нет доступа к исходному коду.
Поэтому, если вам нужна встроенная поддержка 128-битного целого числа и по какой-либо причине вы не хотите полагаться на BigInteger, вы, вероятно, могли бы взломать GUID для выполнения своих задач.
Если вы не против сделать ссылку на библиотеку J# (vjslib.dll включена в VS по умолчанию), то уже есть и реализация BigInteger в.NET
using java.math;
public static void Main(){
BigInteger biggy = new BigInteger(....)
}
C# PCL библиотека для вычислений с большими числами, такими как Int128 и Int256. https://github.com/inTagger/BigMath
В .NET 8 добавлены иSystem.Text.Json.JsonSerializer
. Эти два типаInt128
иUInt128
были представлены в .NET 7
Console.WriteLine(JsonSerializer.Serialize(
[ Int128.MaxValue, UInt128.MaxValue ]
));
// [170141183460469231731687303715884105727,340282366920938463463374607431768211455]
Я считаю, что в Mono есть реализация BigInteger, для которой вы сможете найти источник.
Вот реализация большого целого числа из.net имеет значение.
Существует класс BigInteger, определенный как часть IronPython, который вы можете использовать.