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

Int128 в .Net?

Мне нужно сделать некоторую большую целую математику. Существуют ли какие-либо классы или структуры, которые представляют 128-битовое целое и реализуют все обычные операторы?

Кстати, я понимаю, что десятичное число может использоваться для представления 96-битного int.

4b9b3361

Ответ 1

Здесь он находится в System.Numerics. "Тип BigInteger - неизменный тип, представляющий произвольно большое целое число, значение которого в теории не имеет верхней или нижней границ".

var i = System.Numerics.BigInteger.Parse("10000000000000000000000000000000");

Ответ 2

В то время как BigInteger является лучшим решением для большинства приложений, если у вас есть критические численные вычисления с производительностью, вы можете использовать полные реализации Int128 и UInt128 в Dirichlet.Numerics. Эти типы полезны, если Int64 и UInt64 слишком малы, но BigInteger слишком медленно.

Ответ 4

Если вы не возражаете ссылаться на библиотеку J # (vjslib.dll, включенную в VS по умолчанию), уже существует и реализация BigInteger в .NET.

using java.math;

public static void Main(){
    BigInteger biggy = new BigInteger(....)

}

Ответ 5

BigInteger - теперь стандартная часть С# и друзей в .NET 4.0. Смотрите: Гуннар Пейпман, блог ASP.NET. Обратите внимание, что ЦП обычно может работать с обычными целыми числами намного быстрее и в постоянное время, особенно при использовании обычных математических операторов (+, -,/,...), потому что эти операторы обычно отображаются непосредственно в отдельные инструкции ЦП.

С BigInteger даже самые простые математические операции - это гораздо более медленные вызовы функций для методов, время выполнения которых зависит от размера числа. Это потому, что BigInteger реализует арифметику произвольной точности, которая добавляет значительные, но необходимые накладные расходы. Преимущество заключается в том, что BigIntegers ограничены не 64 или даже 128 битами, а доступной системной памятью (или примерно 2 ^ 64 битами точности, в зависимости от того, что наступит раньше). Читайте здесь.

Ответ 6

С# PCL библиотека для вычислений с большими числами, такими как Int128 и Int256. https://github.com/everbytes/BigMath

Ответ 7

GUID поддерживается 128-битным целым числом в .NET Framework; хотя это не идет ни с одним из типичных методов целочисленного типа.

Я написал обработчик для GUID, прежде чем рассматривать его как 128-битное целое число, но это было для компании, в которой я работал ~ 8 лет назад. У меня больше нет доступа к исходному коду.

Поэтому, если вам нужна встроенная поддержка 128-битного целого числа и по какой-либо причине вы не хотите полагаться на BigInteger, вы, вероятно, могли бы взломать GUID для выполнения своих задач.

Ответ 8

Для тех, кто надеется на легитимность Int128/UInt128 в .NET, некоторая работа по UInt128 аппаратных встроенных UInt128 и 128-битной математики в .NET была продвинута инициативой MS "Машинное обучение". Здесь есть пакет NuGet, который в настоящее время предоставляет некоторые средства для обычных 128-битных целочисленных операций в виде пар long/ulong, и в будущем может включать аппаратные функции, где они доступны. Между тем, они предоставляют кроссплатформенную библиотеку (CpuMathNative), которая выполняет Div64 ("Делить 128-битное значение на lo и hi на den.") И Mul64 (" Mul64 два 64-битных значения для получения 128-битного результата". "), а также MulDiv64 (" Умножьте a и b и разделите на den ", возвращая частное и поместив остаток в rem.), 128-битный v. 128-битный DivRound, Add, Sub, LessThan.

Из этого можно легко создать структуру Int128 и UInt128 и, возможно, передать ее в аппаратных регистрах с осторожным использованием реализации Vector128 (System.Runtime.Intrinsics).

Хотя в качестве сноски, BigMath.PCL - все еще хорошее решение для вставки.

Ответ 9

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

Ответ 12

Здесь класс BigInteger определен как часть IronPython, который вы могли бы использовать.