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]

Вот реализация Int128 в.NET: https://int128.codeplex.com/

Я считаю, что в Mono есть реализация BigInteger, для которой вы сможете найти источник.

Вот реализация большого целого числа из.net имеет значение.

http://msdn.microsoft.com/en-us/magazine/cc163696.aspx

Существует класс BigInteger, определенный как часть IronPython, который вы можете использовать.

Другие вопросы по тегам